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)
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.
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".
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;
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 ...