请考虑以下代码:
procedure Test;
function d1: Variant;
var
DDt: TDateTime;
begin
DDt := EncodeDate(100,1,1);
Result := DDt;
end;
function d2: Variant;
var
DDt: TDateTime;
begin
DDt := EncodeDate(99,12,31);
Result := DDt;
end;
procedure Writedate(V: Variant);
begin
Writeln(string(V));
end;
var
V: Variant;
begin
V := d1;
Writedate(V);
V := d2;
Writedate(V);
end;
第一次拨打Writedate
会成功,输出将是' 01-01-0100'。但是,第二次调用将因“无效参数”失败而失败。失败。检查代码,您可以看到99-12-31日期的Variant
出现EVariantInvalidArgError
错误。
但是,如果我在FormatDateTime('c', TDateTime(V))
上拨打TDateTime
,他们都会成功。实际上,在Variant
包含TDateTime
(其日期在100 CE之前)的任何时候,IDE在检查其值时都会显示EVariantInvalidArgError
。
似乎奇怪的是,Variant
无法处理100前CE日期,TDateTime
可以。这是Delphi中的一个错误吗?我发现它在99和100 CE之间正确有点可疑。
答案 0 :(得分:7)
Variant
可以包含任何日期值,正如您的代码所示(赋值V := d2;
不会产生错误)。
在转换为字符串期间引发错误,编译器委托给Windows平台上的操作系统。此操作失败,因为OLE Automation指定0100年1月1日午夜作为最小有效OLE自动化日期值。