web-dev-qa-db-fra.com

Delphi: Comment déterminer et vider une valeur TDatetime

Semble il n'y a aucun moyen d'attribuer NUL (soit un "valeur non assignée"to TDateTime variables.

La seule façon que j'ai imaginée est d'utiliser quelque chose comme ceci:

function isNull(aDate : TDateTime) : boolean;
const NullDate = 0.0;
var aNullDate : TDatetime;
    ms : Int64;
begin
  aNullDate := NullDate;
  ms := MilliSecondsBetween(aDate,aNullDate);
  result := (ms = Int64(0));
end;

Y a-t-il quelqu'un dehors qui sait la meilleure solution ce qui ne chevauche pas la valeur de date 0?

Les valeurs TDateTime négatives sont-elles dangereuses? (En tant que ressource capable pour le but précédent)

11
xsubira

Comme Andreas l'a déjà écrit, le type TDateTime est en fait double et n'est donc pas "nullable". j'utilise 

const
  c_UnassignedDate = -693594;

pour une valeur de date vide car cela représente une date impossible de 00/00/0000. Mais par exemple, DevExpress utilise

NullDate = -700000;
InvalidDate = NullDate + 1;

Donc, il semble y avoir aucun vale standard convenu, vous devriez en choisir un qui convient à vos besoins.

14
ain

Vous devez d’abord définir ce que vous entendez par «une valeur TDateTime vide».

Une valeur TDateTime est un double avec la date encodée dans la partie entière et l'heure encodée dans la partie décimale. Donc, la chose la plus proche d'une "date zéro" que vous pouvez obtenir est probablement 0.

Par conséquent, testez simplement ADate <> 0 pour vérifier si la date est 'nulle'.

Mais méfiez-vous: si vous déclarez une variable locale TDateTime, il ne s'agira pas nécessairement de =0 avant que vous lui donniez une valeur. Cela peut être n'importe quoi. Bien entendu, la même chose s’applique aux variables de type integer, double, boolean, ...

De plus, je crois qu'une TDateTime avec la valeur 0 code la date 1899-12-30.

Enfin, les valeurs TDateTime négatives sont parfaitement normales. Par exemple, -5000 correspond à 1886-04-22.

Je ne comprends pas bien le but de votre code. Si vous souhaitez utiliser 0 comme valeur "non affectée" (ce qui est mauvais si vous êtes intéressé par des dates proches de 1899-12-30), pourquoi ne pas simplement faire

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := ADate = 0;
end;

ou, éventuellement (mais pas de manière équivalente!),

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := IsZero(Date);
end;

Dans sa réponse, ain a proposé deux solutions plus raisonnables pour la valeur "date non attribuée".

9
Andreas Rejbrand

le tDateTime n'est pas défini pour les valeurs comprises entre 0 et -1, ce qui signifie qu'un tDateTime de -0,5 est une valeur indéfinie et utile pour une date nulle comme alternative à NaN. DateTimeToString affichera -0.5 la même chose que +0.5; 

1
John Hillier

Utilisez PDateTime à la place de TDateTime et envoyez comme valeur nulle. Si aucun pointeur sur valeur ne résulte, aucune valeur n'est obtenue.

Pour vérifier la valeur, utilisez Assigned ptr:

MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...
1
Eugene.LatDev