時間と関連タイプ(1)-TDateTimeとDouble

1668 ワード



// :

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()1つの数を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;