Delphi: определение и удаление значения TDatetime
Кажется, что нет способа присвоить NULL (либо " неназначенное значение " переменным 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
ли отрицательные значения TDateTime
? (Как способный ресурс для предыдущей цели)
Ответы
Ответ 1
Как уже писал Андреас, тип TDateTime
на самом деле double
и, следовательно, не "nullable". Я использую
const
c_UnassignedDate = -693594;
для пустого значения даты, так как это означает невозможную дату 00/00/0000
. Но, например, DevExpress использует
NullDate = -700000;
InvalidDate = NullDate + 1;
Итак, похоже, что нет согласованной стандартной долины, вы должны выбрать тот, который вам подходит.
Ответ 2
Сначала вам нужно определить, что вы подразумеваете под "пустым значением TDateTime
".
Значение A TDateTime
- это двойное число с датой, закодированной в целочисленной части, и временем, закодированным в дробной части. Итак, ближайшая вещь к "нулевой дате", которую вы можете получить, вероятно, 0
.
Следовательно, просто протестируйте ADate <> 0
, чтобы проверить, является ли дата "null".
Но будьте осторожны: если вы объявите локальную переменную TDateTime
, тогда она не обязательно будет =0
, прежде чем вы дадите ей значение. Это может быть что угодно. Конечно, то же самое относится и к переменным типа integer
, double
, boolean
,...
Кроме того, я считаю, что 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;
В своем ответе ain дал пару более разумных решений для значения "непризнанной даты".
Ответ 3
Используйте PDateTime вместо TDateTime и отправляйте как значение nil. Если нет указателя на значение, не получайте значения.
Для проверки использования значения Назначено ptr:
MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...
Ответ 4
tDateTime - это undefined для значений от 0 до -1, что означает, что tDateTime -0.5 является значением undefined и полезна для нулевой даты в качестве альтернативы NaN. DateTimeToString будет отображать -0.5 так же, как +0.5;