2008-10-03 42 views
7

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).Matemáticas de tiempo en Delphi

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

Modificación del 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) ha construido en cualquier ayudantes para la fecha de matemáticas, que es una de mis cosas favoritas :)

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

Gracias!

Respuesta

15

Según lo mencionado por gabr y mliesen, eche un vistazo a las unidades DateUtils y SysUtils, funciones útiles incluyen.

  • IncDay - Sume o restar un número de días.
  • IncMonth - Agregue o reste varios meses.
  • IncWeek - Agregue o restar varias semanas.
  • IncYear - Agregue o reste varios años.
  • EncodeDate - Devuelve un valor de TDateTime de los parámetros Año, Mes y Día.
+1

Esta respuesta fue significativamente más completa que la respuesta más votado. –

+1

Para aquellos que buscan algo que maneja el tiempo también, DaetUtils también contiene IncHour, Inc Minute, IncSecond, Inc Mili Second –

3

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

Véase también EncodeDate y DecodeDate

0

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

5

¿Qué desea que suceda si el día del mes actual no existe en su próximo mes? 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 Julian Bucknall's article en 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 anomalí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 - Sume o reste varios días.
IncWeek - Sume o reste un número de semanas.

Pero si debe usar las funciones incorporadas, al menos asegúrese de que hacen 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. Una vez dicho esto, aquí está la lista completa de las funciones integradas:

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

En cuanto a la segunda parte de su pregunta, cómo configurar la fecha del sistema & tiempo usando un TDateTime, el siguiente código descaradamente robado de otro post 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; 
Cuestiones relacionadas