2008-10-03 19 views
7

J'ai un problème assez inhabituel (pour moi). J'écris une application qui permettra à un utilisateur de changer l'heure de son système en avant ou en arrière soit par date explicite (changer ma date au 6/3/1955) ou par incrément en utilisant les boutons (aller de l'avant 1 mois). J'écris ceci pour aider certains de mes utilisateurs à tester certains logiciels nécessitant des sauts de ce type afin de simuler l'utilisation réelle d'un système de facturation.Maths du temps en Delphi

Modification du temps de Delphi est bien sûr très facile:

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

Mais je ne sais pas si Delphi (2006) a tout construit des aides pour les mathématiques date, qui est l'un de mes favoris moins de choses :)

Des suggestions pour la meilleure façon de gérer cela? Je préférerais rester natif comme les appels datetime winapi sucent.

Merci!

Répondre

15

Comme mentionné par gabr et mliesen, jetez un oeil sur les unités DateUtils et SysUtils, les fonctions utiles comprennent.

  • IncDay - Ajouter ou soustraire un nombre de jours.
  • IncMonth - Ajouter ou soustraire un nombre de mois.
  • IncWeek - Ajouter ou soustraire un nombre de semaines.
  • IncYear - Ajouter ou soustraire un nombre d'années.
  • EncodeDate - Renvoie une valeur TDateTime à partir des paramètres Year, Month et Day.
+1

Cette réponse était beaucoup plus complète que la plus haute réponse votée. –

+1

Pour ceux qui recherchent quelque chose qui gère également le temps, DaetUtils contient également IncHour, IncMinute, IncSecond, IncMilliSecond –

3

La VCL a des types (TDate et TDateTime) qui sont doubles et que vous pouvez utiliser dans les opérations arithmétiques.

Voir aussi EncodeDate et DecodeDate

0

L'unité SysUtils contient de nombreux helpers (et comme le signale gabr, également dans DateUtils).

5

Que voulez-vous que se passe-t-il si le jour du mois en cours n'existe pas dans votre mois futur? Dis, le 31 janvier + 1 mois? Vous avez le même problème si vous incrémentez l'année et la date de début est le 29 février sur une année bissextile. Il ne peut donc pas y avoir une fonction IncMonth ou IncYear universelle qui fonctionnera de manière cohérente à toutes les dates.

Pour toute personne intéressée, je recommande chaudement Julian Bucknall's article sur les complexités qui sont inhérentes à ce type de calcul sur la façon de calculer le nombre de mois et de jours entre deux dates. Voici les seules fonctions génériques d'incrémentation de date qui n'introduisent pas d'anomolies dans les calculs de date génériques. Mais il accomplit cela seulement en transférant la responsabilité au programmeur qui a probablement les exigences exactes de l'application spécifique qu'il/elle programme.

IncDay - Ajouter ou soustraire un nombre de jours.
IncWeek - Ajouter ou soustraire un nombre de semaines. Mais si vous devez utiliser les fonctions intégrées, assurez-vous au moins de faire ce que vous voulez. Jetez un oeil aux unités DateUtils et SysUtils. Avoir le code source de ces fonctions est l'un des aspects les plus cool de Delphi. Cela dit, voici la liste complète des fonctions intégrées:

IncDay - Ajouter un ou soustraire un certain nombre de jours.
IncWeek - Ajouter ou soustraire un nombre de semaines.
IncMonth - Ajouter ou soustraire un nombre de mois.
IncYear - Ajouter ou soustraire un nombre d'années.

Quant à la deuxième partie de votre question, comment définir la date système & temps à l'aide d'un tDateTime, le code suivant sans vergogne volé à un autre poste fera le travail:

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