時間と関連タイプ(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;