FormatDateTime 是 Delphi 專門用於 TDateTime 類型格式化的標準函數,格式字串支援年月日、時分秒、毫秒、星期、時代等豐富指令。本文通過 40+ 實例系統梳理各指令效果與組合技巧。
function FormatDateTime(const Format: string; DateTime: TDateTime): string;
| 指令 | 含義 | 示例 (2007-12-19 00:47:16.576) |
|---|---|---|
| c | 短日期+短時間 (系統預設) | 2007-12-18 23:56:05 |
| d | 日 (1-31, 不補 0) | 19 |
| dd | 日 (01-31, 雙位) | 19 |
| ddd | 星期縮寫 (本地化) | 星期三 |
| dddd | 星期全寫 (本地化) | 星期三 |
| ddddd | 短日期格式 | 2007-12-19 |
| dddddd | 長日期格式 | 2007年12月19日 |
| e | 年 (1 位, 如 7) | 7 |
| ee | 年 (2 位, 如 07) | 07 |
| eee / eeee | 年 (4 位, 如 2007) | 2007 |
| m | 月 (1-12, 不補 0) | 12 |
| mm | 月 (01-12, 雙位) | 12 |
| mmm / mmmm | 月全寫 (本地化, 如 十二月) | 十二月 |
| y / yy / yyy / yyyy | 年 (同 e 系列) | 07 / 07 / 2007 / 2007 |
| t | 短時間格式 | 0:21 |
| tt | 長時間格式 | 0:22:13 |
| ampm | 上午/下午 (本地化) | 上午 |
| h / hh | 時 (12/24 制視系統設置) | 9 / 09 |
| n / nn | 分 | 58 / 58 |
| s / ss | 秒 | 6 / 06 |
| z / zz / zzz | 毫秒 (1/2/3 位) | 24 / 524 / 524 |
-,/ 等效於 -。'yy"/"mm"/"dd' 輸出 07/12/19。'當前時間是: 'yyyy-m-d h:n:s:zz 輸出 當前時間是: 2007-12-19 0:47:16:576。var s: string;
begin
s := FormatDateTime('c', Now); {短日期時間}
s := FormatDateTime('ddddd', Now); {短日期}
s := FormatDateTime('dddddd', Now); {長日期}
s := FormatDateTime('yyyymmdd', Now); {20071219 緊湊格式}
s := FormatDateTime('hh:nn:ss', Now); {00:47:16 標準時間}
s := FormatDateTime('"Year "yyyy', Now); {Year 2007 嵌入字面量}
s := FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', Now); {ISO 8601 風格含毫秒}
ShowMessage(s);
end;
所有「本地化」指令(ddd/dddd/mmm/mmmm/ampm/t/tt)輸出取決於全域 FormatSettings 或傳入的 TFormatSettings 記錄。多線程/多語言環境建議顯式構建 TFormatSettings 傳入重載版本:
var FS: TFormatSettings;
begin
FS := TFormatSettings.Create('zh-CN'); {或 'en-US'}
s := FormatDateTime('yyyy年mm月dd日', Now, FS);
end;
'd m y' 會被解析為三個指令,若需字面量 d 需用 '"d"'"m"'"y'"。m 在日期上下文為月,在時間上下文為分;FormatDateTime 根據位置自動判斷,但混合格式字串中易混淆,建議使用 mm/nn 明確區分。e 系列用於日曆時代(如日本和曆),公曆下等同於 y 系列。FormatDateTime 指令系統完整覆蓋日期時間顯示的所有維度,靈活的分隔符與字面量嵌入機制使其能生成任意人類可讀格式,配合 TFormatSettings 完美支援多語言本地化。