时间与相关类型(1) - TDateTime 与 Double


//相关函数:

SysUtils.FloatToDateTime();

SysUtils.TryFloatToDateTime();


 
   

在 System 单元定义有: TDateTime = type Double;

看来 TDateTime 是一个 8 字节 64 位数据, 不过是 Double 的别名.



{测试: TDateTime 就是一个 Double}

var

  t: TDateTime;

  d: Double;

  s: string;

begin

  t := EncodeDateTime(2009, 5, 22, 11, 22, 33, 999);



  {强制转换}

  d := Double(t);

  ShowMessage(FloatToStr(d)); //39955.4740046181



  {隐式转换}

  d := t;

  ShowMessage(FloatToStr(d)); //39955.4740046181



  {不必转换}

  ShowMessage(FloatToStr(t)); //39955.4740046181



  {直接把一个 Double 当作 TDateTime 看待}

  s := FormatDateTime('yyyy-m-d h:m:s:z', 39955.4740046181);

  ShowMessage(s);             //2009-5-22 11:22:33:999

end;


 
   

不会是任何一个 Double 都会转换成一个合法的时间, SysUtils 单元给出了最小与最大时间的常数:

const

  MinDateTime: TDateTime = -657434.0;      { 01/01/0100 12:00:00.000 AM }

  MaxDateTime: TDateTime =  2958465.99999; { 12/31/9999 11:59:59.999 PM }


保险起见, 应该通过: FloatToDateTime(); 或 TryFloatToDateTime(); 把一个数转换到 TDateTime;
反向转换就没必要用函数了.

{使用 TryFloatToDateTime}

var

  t: TDateTime;

  d: Double;

begin

  d := 0;

  if TryFloatToDateTime(d, t) then

    ShowMessage(DateTimeToStr(t)); //1899-12-30

end;



{使用 FloatToDateTime; 转换失败或遇到非法时间时会抛出异常}

var

  t: TDateTime;

  d: Double;

begin

  d := 0;

  t := FloatToDateTime(d);

  ShowMessage(DateTimeToStr(t)); //1899-12-30

end;



{当时间是 1899年12月30日 0时0分0秒 0毫秒时, TDateTime 对应的时间值是 0}

var

  d: Double;

  t: TDateTime;

begin

  t := StrToDateTime('1899-12-30 0:0:0:0');

  d := Double(t);

  ShowMessage(FloatToStr(d)); //0

end;


 
   

你可能感兴趣的:(DateTime)