Delphi: как определить и опорожнить значение TDatetime
Кажется, нет способа назначить NULL (или "неприсвоенным значением " to TDateTime переменные.
единственный способ, который я себе представлял, - это использовать что-то вроде этого:
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;
есть ли кто-нибудь, кто знает лучшее решение, что не перекрывает значение даты 0?
отрицательные значения TDateTime опасно? (Как способный ресурс для предыдущей цели)
4 ответов
как Андреас уже писал,TDateTime
тип на самом деле double
и, следовательно, не "nullable". Я использую
const
c_UnassignedDate = -693594;
для пустого значения даты, поскольку это представляет невозможную дату 00/00/0000
. Но, например, DevExpress использует
NullDate = -700000;
InvalidDate = NullDate + 1;
таким образом, кажется, нет согласованной стандартной долины, вы должны выбрать тот, который соответствует вашим потребностям.
сначала вам нужно определить, что вы подразумеваете под " пустым TDateTime
значение'.
A TDateTime
value-это double с датой, закодированной в целочисленной части, и временем, закодированным в дробной части. Таким образом, ближе всего к "нулевой дате" вы можете получить, вероятно,0
.
следовательно, просто проверить ADate <> 0
чтобы проверить, является ли дата "null".
но будьте осторожны: если вы объявляете TDateTime
локальная переменная тогда это не обязательно будет =0
прежде чем вы дадите его значение. Это может быть что угодно. Конечно, то же самое относится и к переменным типа integer
, double
, boolean
, ...
кроме того, я считаю, что a TDateTime
со значением 0
кодирует дату 1899-12-30.
в конце концов, отрицательные TDateTime
значения совершенно нормальны. Например, -5000
соответствует 1886-04-22
.
я не совсем понимаю смысл вашего кода. Если вы хотите использовать 0
как значение "неназначенный" (что плохо, если вы заинтересованы в даты близки к 1899-12-30), почему бы просто не
function IsUnassigned(ADate: TDateTime): boolean;
begin
result := ADate = 0;
end;
или, возможно (но не эквивалентно!),
function IsUnassigned(ADate: TDateTime): boolean;
begin
result := IsZero(Date);
end;
в своем ответе Айн дал несколько более разумных вариантов для значения "неназначенная дата".
tDateTime не определено для значений между 0 и -1, что означает, что tDateTime -0.5 является неопределенным значением и полезно для нулевой даты в качестве альтернативы NaN. DateTimeToString отобразит -0.5 то же самое, что и +0.5;
используйте PDateTime вместо TDateTime и отправьте как нулевое значение. Если нет указателя на значение, результат не имеет значения.
для проверки значения используйте назначенный ptr:
MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...