天天看點

delphi 時間格式操作

FormatDateTime('yyyy-mm-dd hh:nn:ss',Now)

FormatDateTime('hh:mm:ss:zz',Now)

if (TimeOf(now) < pub_StartWorkTime) or (TimeOf(now) > pub_EndWorkTime) then

exit; //非工作時間退出

讀ini

       Delphi中TFileTime、TSystemTime 及 DOS 時間

  核心提示://TSystemTime 是系統定義的結構, 一看就是最友善實用的那種, 但要占 16 個位元組:TSystemTime = recordwYear: Word;wMonth: Word;wDayOf...

//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:\Windows\System32\Notepad.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:\Windows\System32\Notepad.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 格式的, 需要轉換使用.

Tags:時間 

下一篇: 格式化時間

繼續閱讀