//相關函數:
SysUtils.DateTimeToFileDate();
SysUtils.FileDateToDateTime();
SysUtils.DateTimeToSystemTime();
SysUtils.SystemTimeToDateTime();
Windows.SystemTimeToFileTime();
Windows.FileTimeToSystemTime();
Windows.FileTimeToDOSDateTime();
Windows.DOSDateTimeToFileTime();
Windows.FileTimeToLocalFileTime();
Windows.LocalFileTimeToFileTime();
Windows.GetLocalTime();
//TSystemTime 是系統定義的結構, 一看就是最方便實用的那種, 但要占 16 個字節:
TSystemTime = record
wYear: Word;
wMonth: Word;
wDayOfWeek: Word;
wDay: Word;
wHour: Word;
wMinute: Word;
wSecond: Word;
wMilliseconds: Word;
end;
//TFileTime 也是系統定義的結構, 同 TDateTime 一樣大小, 但結構原理完全不同:
TFileTime = record
dwLowDateTime: DWord;
dwHighDateTime: DWord;
end;
TFileTime 記錄的是從 1601-1-1 起的時間值, 以 100 納秒(也就是萬分之一毫秒)為單位
//DOS 時間就是一個 32 位(4字節)的整數(Integer), 好像沒有專門的結構, 可用 LongRec 等代為解析.
DOS 時間的尺寸是 TFileTime、TDateTime 的 1/2, 是 TSystemTime 的 1/4; 因此不很精確.
它只能表示從 1980-2107 之間的時間, 且只能精確到 2 秒.
//下面幾個函數一看就知道誰轉換到誰:
SysUtils.DateTimeToSystemTime();
SysUtils.SystemTimeToDateTime();
Windows.SystemTimeToFileTime();
Windows.FileTimeToSystemTime();
Windows.FileTimeToDOSDateTime();
Windows.DOSDateTimeToFileTime();
//但並沒有直接給 TFileTime 和 TDateTime 直接轉換的函數;
//下面兩個函數是 TDateTime 和 DOS 時間的轉換; 文件的創建、修改、訪問時間就是用這個 DOS 時間記錄的.
SysUtils.DateTimeToFileDate();
SysUtils.FileDateToDateTime();
{轉換到 DOS 時間的例子:}
var
T: TDateTime;
F,DOSTime: Integer;
FileTime: TFileTime;
SystemTime: TSystemTime;
begin
{構建一個 TDateTime, 並轉換到 DOS 時間}
T := EncodeDateTime(2009, 5, 22, 11, 22, 33, 999);
F := DateTimeToFileDate(T);
ShowMessage(IntToStr(F)); //985029328; 注意這個數很小, 下面會發現不精確
{再從 DOS 時間轉回 TDateTime}
T := FileDateToDateTime(F);
ShowMessage(FormatDateTime('yyyy-m-d h:m:s:zzz', T)); //2009-5-22 11:22:32:000; 只精確到 2 秒
{TDateTime -> TSystemTime -> TFileTime -> DOS 時間}
DateTimeToSystemTime(T, SystemTime);
SystemTimeToFileTime(SystemTime, FileTime);
FileTimeToDosDateTime(FileTime, LongRec(DosTime).Hi, longRec(DOSTime).Lo);
ShowMessage(IntToStr(SizeOf(SystemTime))); //985029328; 和上面得到的值一樣
end;
DateTimeToFileDate 轉換出的時間不是 TFileTime, 而是 DOS 時間或叫文件時間;
譬如我們用 FileAge 函數返回的文件最後修改的時間(一個 Integer)就是個 DOS 時間.
{讀取記事本程序最後被修改的時間}
var
DOSTime: Integer;
FileTime: TFileTime;
SysTime: TSystemTime;
DateTime: TDateTime;
str: string;
begin
DOSTime := FileAge('C:WindowsSystem32Notepad.exe');
ShowMessage(IntToStr(DOSTime)); //948804037; 這是讀取結果
{轉換為可以理解的格式}
DosDateTimeToFileTime(LongRec(DosTime).Hi, LongRec(DOSTime).Lo, FileTime);
FileTimeToSystemTime(FileTime, SysTime);
str := Format('%d年%d月%d日 %d:%d:%d', [SysTime.wYear, SysTime.wMonth,
SysTime.wDay, SysTime.wHour, SysTime.wMinute, SysTime.wSecond]);
ShowMessage(str); //2008年4月13日 19:14:10
{如果僅僅是要這個時間, 可以這樣}
FileAge('C:WindowsSystem32Notepad.exe', DateTime);
ShowMessage(DateTimeToStr(DateTime)); //2008-4-13 19:14:10
end;
又是我們可能只需要一個 TSystemTime 格式的時間, 沒必要轉來轉去, 可以直接用 GetLocalTime 函數獲取:
var
SysTime: TSystemTime;
DT1, DT2: TDateTime;
begin
GetLocalTime(SysTime);
DT1 := SystemTimeToDateTime(SysTime);
DT2 := Now;
{這兩個時間顯示應該是一樣的}
ShowMessage(DateTimeToStr(DT1));
ShowMessage(DateTimeToStr(DT2));
end;
另外 FileTimeToLocalFileTime 和 LocalFileTimeToFileTime 是本地時間和 UTC(國際標准計時) 的轉換;
用 API 函數獲取的 TFileTime 時間都是 UTC 格式的, 需要轉換使用.