Delphi:如何确定和清空TDatetime值

时间:2013-02-20 16:33:30

标签: delphi datetime null unassigned-variable

似乎无法将 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值是否危险? (作为以前用途的能力资源)

5 个答案:

答案 0 :(得分:14)

正如Andreas所写,TDateTime类型实际上是double,因此不是“可空”。我用

const
  c_UnassignedDate = -693594;

表示空日期值,因为这表示00/00/0000的不可能日期。但是例如DevExpress使用

NullDate = -700000;
InvalidDate = NullDate + 1;

所以似乎没有商定标准的谷,你应该选择一个符合你需要的谷。

答案 1 :(得分:9)

首先,您需要通过'空TDateTime值来定义您的意思。

TDateTime值是一个double,其中日期在整数部分中编码,时间在小数部分中编码。因此,最接近'null date'的东西可能是0

因此,只需测试ADate <> 0以测试日期是否为“空”。

但要注意:如果你声明一个TDateTime局部变量,那么在你给它一个值之前它不一定是=0。它可以是任何东西。当然,同样的事情适用于integerdoubleboolean,......的变量......

另外,我认为值为TDateTime的{​​{1}}对日期1899-12-30进行编码。

最后,负0值完全正常。例如,TDateTime对应-5000

我不太明白你的代码。如果您想使用1886-04-22作为'未分配'值(如果您对接近1899-12-30的日期感兴趣,那么为什么不做呢)

0

或者,可能(但不等同!),

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

在他的回答中,ain为“未分配日期”值提供了几个更合理的选择。

答案 2 :(得分:1)

使用PDateTime代替TDateTime,并以nil值发送。如果没有指向value的指针,则结果没有值。

要检查值,请使用Assigned ptr:

MyDatePointer := nil;
if ( Assigned(MyDatePointer)) then ...

答案 3 :(得分:1)

对于介于0和-1之间的值, tDateTime未定义,这意味着-0.5的tDateTime是未定义的值,对于作为NaN替代的空日期非常有用。 DateTimeToString将显示-0.5与+0.5相同;

答案 4 :(得分:1)

在方法{{1}中的库 Spring Framework for Delphi http://www.spring4d.org)的单元Spring.Persistence.Core.Session.pas中,如果结果使用值TSession.ExecuteScalar<T>为NULL

我认为,您的功能可以看起来像

Default(T);