Per prima cosa è necessario definire cosa intendi per "valore vuoto TDateTime
".
Un valore TDateTime
A è un doppio con la data codificata nella parte intera e il tempo codificato nella parte frazionaria. Quindi, la cosa più vicina a una "data nulla" che è possibile ottenere è probabilmente 0
.
Quindi, prova semplicemente ADate <> 0
per verificare se la data è "nulla".
Ma attenzione: se si dichiara una variabile locale TDateTime
, non sarà necessariamente =0
prima di assegnargli un valore. Può essere qualsiasi cosa. Naturalmente, la stessa cosa vale per le variabili di tipo integer
, double
, boolean
, ...
Inoltre, credo che un TDateTime
con un valore 0
codifica la data 1899-12-30.
Infine, i valori negativi TDateTime
sono perfettamente normali. Ad esempio, -5000
corrisponde a 1886-04-22
.
Non capisco il punto del tuo codice. Se si desidera utilizzare 0
come valore 'non assegnato' (che è male se siete interessati a date vicine 1899-12-30), perché non fare semplicemente
function IsUnassigned(ADate: TDateTime): boolean;
begin
result := ADate = 0;
end;
o, forse (ma non in modo equivalente!),
function IsUnassigned(ADate: TDateTime): boolean;
begin
result := IsZero(Date);
end;
Nella sua risposta, ain ha dato un paio di scelte più ragionevoli per il valore di 'data non assegnato'.
fonte
2013-02-20 16:35:26
Se si intende utilizzare questa funzione, penso che sia, sicuramente 'NullDate' dovrebbe essere una costante globale? –
Ho riscontrato problemi durante il confronto di una variabile TDateTime con valore assegnato zero al valore const 0. Un _semplice_ ** se ** come questo non ha verificato la condizione 'var v_datetime: TDatetime;' 'v_datetime: = 0; ' ' if (v_datetime = 0) then actionToTake' – xsubira
Ciò è dovuto al fuzz a virgola mobile. Usa 'Math.IsZero'. –