为什么变体在100 CE之前不能包含TDateTime?

时间:2015-05-22 08:46:22

标签: delphi

请考虑以下代码:

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之间正确有点可疑。

1 个答案:

答案 0 :(得分:7)

Variant可以包含任何日期值,正如您的代码所示(赋值V := d2;不会产生错误)。

在转换为字符串期间引发错误,编译器委托给Windows平台上的操作系统。此操作失败,因为OLE Automation指定0100年1月1日午夜作为最小有效OLE自动化日期值。