//相關函數:
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;