decodedate delphi date time

decodedate - Tiempo matemático en Delphi



decodedate delphi (5)

El VCL tiene tipos (TDate y TDateTime) que son dobles y se pueden usar en operaciones aritméticas.

También vea EncodeDate y DecodeDate

Tengo un problema bastante inusual (para mí). Estoy escribiendo una aplicación que permitirá a un usuario cambiar el tiempo de su sistema hacia adelante o hacia atrás ya sea por fecha explícita (cambie mi fecha a 6/3/1955) o incremente usando botones (avance 1 mes).

Escribo esto para ayudar a algunos de mis usuarios a probar algunos programas que requieren saltos como este para simular el uso de un sistema de facturación en el mundo real.

Cambiar el tiempo en Delphi es, por supuesto, muy fácil:

SetDateTime(2008,05,21,16,07,21,00);

Pero no estoy seguro de si Delphi (2006) tiene alguna ayuda incorporada para las matemáticas de fecha, que es una de mis cosas menos favoritas :)

¿Alguna sugerencia para la mejor manera de manejar esto? Preferiría seguir siendo nativo, ya que las llamadas de winapi datetime apestan.

¡Gracias!


Hay muchos ayudantes en la unidad SysUtils (y como señaló gabr, también en DateUtils).


¿Qué quieres que suceda si el día del mes actual no existe en tu mes futuro? Decir, 31 de enero + 1 mes? Tiene el mismo problema si aumenta el año y la fecha de inicio es el 29 de febrero en un año bisiesto. Por lo tanto, no puede haber una función universal IncMonth o IncYear que funcione de manera constante en todas las fechas.

Para cualquier persona interesada, recomiendo encarecidamente el artículo de Julian Bucknall sobre las complejidades que son inherentes a este tipo de cálculo sobre cómo calcular el número de meses y días entre dos fechas.

La siguiente es la única función genérica de incremento de fecha posible que no introduce anomías en la matemática de fecha genérica. Pero solo logra esto al devolver la responsabilidad al programador que presumiblemente tiene los requisitos exactos de la aplicación específica que está programando.

IncDay : agregue o reste varios días.
IncWeek - Sume o reste un número de semanas.

Pero si debe usar las funciones integradas, al menos asegúrese de que hagan lo que usted quiere que hagan. Eche un vistazo a las unidades DateUtils y SysUtils. Tener el código fuente para estas funciones es uno de los aspectos más geniales de Delphi. Habiendo dicho eso, aquí está la lista completa de funciones integradas:

IncDay : agregue o reste varios días.
IncWeek - Sume o reste un número de semanas.
IncMonth : agregue o reste una cantidad de meses.
IncYear - Agregue o reste una cantidad de años.

En cuanto a la segunda parte de su pregunta, cómo configurar la fecha y la hora del sistema con un TDatetime, el siguiente código descaradamente robado de otra publicación hará el trabajo:

procedure SetSystemDateTime(aDateTime: TDateTime); var lSystemTime: TSystemTime; lTimeZone: TTimeZoneInformation; begin GetTimeZoneInformation(lTimeZone); aDateTime := aDateTime + (lTimeZone.Bias / 1440); DateTimeToSystemTime(aDateTime, lSystemTime); setSystemTime(lSystemTime); end;


Como mencionan gabr y mliesen, eche un vistazo a las unidades DateUtils y SysUtils , que incluyen funciones útiles.

  • IncDay : agregue o reste varios días.
  • IncMonth : agregue o reste una cantidad de meses.
  • IncWeek : agregue o reste varias semanas.
  • IncYear - Agregue o reste una cantidad de años.
  • EncodeDate - Devuelve un valor de TDateTime de los parámetros Año, Mes y Día.

Hay muchos ayudantes en la unidad DateUtils .