Delphi:如何确定和清空TDatetime值

xsu*_*ira 15 delphi null datetime 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;
Run Code Online (Sandbox Code Playgroud)

是否有谁知道更好的解决方案什么不重叠0日期值?

负值是TDateTime危险的吗?(作为以前用途的能力资源)

ain*_*ain 15

正如安德烈亚斯已经写过的那样,这种TDateTime类型实际上double并不是"可空的".我用

const
  c_UnassignedDate = -693594;
Run Code Online (Sandbox Code Playgroud)

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

NullDate = -700000;
InvalidDate = NullDate + 1;
Run Code Online (Sandbox Code Playgroud)

所以似乎没有商定标准的谷,你应该选择一个适合你的需求.

  • 没有**日**和**月**为0(零)的日期.在数据库中,如果日期未分配,则应使用"NULL",而不是某些魔法日期. (2认同)

And*_*and 9

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

TDateTime值是与所述整数部分和小数部分编码的编码时间的日期双.所以,你可以得到的最接近'null date'的东西可能就是0.

因此,只需测试ADate <> 0以测试日期是否为"空".

但要注意:如果你声明一个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;
Run Code Online (Sandbox Code Playgroud)

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

function IsUnassigned(ADate: TDateTime): boolean;
begin
  result := IsZero(Date);
end;
Run Code Online (Sandbox Code Playgroud)

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