PDA

Ver la Versión Completa : MonthBetweens - Dudar del Resultado


vtdeleon
13-02-2006, 03:24:52
Saludos

He estado desarrollando una aplicacion en la que uso las funciones MonthBetween, YearsBetween y WeeksBetween.

El ultimo no da problema alguno, pues sea como sea sera un multiplo de 7, a diferencia de las 2 primeras.

Y es que este mes (Feb) solo tiene 28 dias, y mediante el sistema he querido saber cuantos meses hay entre el 12/02/06 y el 13/04/06. Me he quedado anodado con la respuesta, pues me dice que solo tiene 1 mes:eek:.

He fundido por completo mi cerebro buscando donde demonios esta el error en mi codigo. Buscando y buscando, horas y horas sin pestañar, me he encontrado con la sorpresa de que no es mi codigo, sino el codigo de Delphi, pues este hace el calculo por un aproximado.:mad:
DateUtils
var
{BDS2006}
{ average over a 4 year span }
ApproxDaysPerMonth: Double = 30.4375;
ApproxDaysPerYear: Double = 365.25;
Estoy sorprendido con esto. No existe exactitud usando las funciones mencionadas mas arriba!

Esto quiere decir que desde el 12 de feb 2006 al 13 de marz 2006 no hay un mes para Delphi.

Por que no usar DaysInMonth y DaysInYears?, y no hacer esos aproximados tan feo, tan barbaros. Aunque seria un poquito mas largo el codigo interno, pero YO arriesgaria espacio por exactitud.

A consecuencia de esto, he decido hacer mi propia funcion para hacer esto, pues ahora no confio en lo absoluto en estas funciones. Y quien sabe que otras funciones no son exactas.

dec
13-02-2006, 05:52:03
Hola,

Bueno. Si uno busca en la ayuda de Delphi sobre la función "MonthsBetween" esto es lo que se encuentra, primeramente:


Returns the approximate number of months between two specified TDateTime values.

Y, a continuación, en la descripción de la misma función, lo siguiente:


Call MonthsBetween to obtain the difference, in months, between two TDateTime values. Because months are not all the same length, MonthsBetween returns an approximation based on an assumption of 30.4375 days per month. Fractional months are not counted. Thus, for example, MonthsBetween reports the difference between Feb 1 and Mar 1 as 0.

Es decir, que, somos nosotros los que nos llevamos a engaño, pero en la ayuda de Delphi se deja claro que el resultado se dará por aproximación.