加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

delphi – 为什么Variant在100 CE之前不能包含TDateTime?

发布时间:2020-12-15 09:52:47 所属栏目:大数据 来源:网络整理
导读:请考虑以下代码: 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 Wri
请考虑以下代码:

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日期的变体有一个EVariantInvalidArgError错误.

但是,如果我在TDateTime上调用FormatDateTime(‘c’,TDateTime(V)),它们都会成功.实际上,在Variant包含TDateTime的任何时刻,其日期都在100 CE之前,IDE在检查其值时将显示EVariantInvalidArgError.

看起来奇怪的是,当TDateTime可以时,Variant无法处理100之前的CE日期.这是Delphi中的一个错误吗?我发现在99和100之间有点可疑.

解决方法

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读