程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 時間與相關類型(3): TFileTime、TSystemTime 及 DOS 時間

時間與相關類型(3): TFileTime、TSystemTime 及 DOS 時間

編輯:Delphi

//相關函數:
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 格式的, 需要轉換使用.



  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved