Delphi SysUtils 單元提供豐富的日期時間轉換函數,掌握 FormatDateTime 格式化代碼是處理國際化介面、報表輸出、日誌記錄的基礎技能。
| 方向 | 函數 | 用途 |
|---|---|---|
| 字串 → 日期時間 | StrToDate / StrToDateDef / TryStrToDate | 僅日期部分 |
StrToTime / StrToTimeDef / TryStrToTime | 僅時間部分 | |
StrToDateTime / StrToDateTimeDef / TryStrToDateTime | 日期時間完整解析 | |
| 日期時間 → 字串 | DateToStr | 短日期格式 (受區域設定影響) |
TimeToStr | 短時間格式 | |
DateTimeToStr | 完整日期時間 | |
DateTimeToString | 自訂格式字串輸出 | |
| 通用格式化 | FormatDateTime | 最靈活,支援完整格式代碼 |
| 代碼 | 意義 | 範例輸出 | 備註 |
|---|---|---|---|
y | 年份 (不補零) | 9, 2009 | |
yy | 年份兩位 | 09 | |
yyyy | 年份四位 | 2009 | 推薦使用 |
m | 月份 (不補零) | 1..12 | |
mm | 月份兩位 | 01..12 | |
mmm | 月份縮寫 | Jan, 1月 | 受 Locale 影響 |
mmmm | 月份全名 | January, 一月 | |
d | 日期 (不補零) | 1..31 | |
dd | 日期兩位 | 01..31 | |
ddd | 星期縮寫 | Mon, 週一 | |
dddd | 星期全名 | Monday, 星期一 | |
h | 小時 12制 (不補零) | 1..12 | |
hh | 小時 12制 兩位 | 01..12 | |
H | 小時 24制 (不補零) | 0..23 | |
HH | 小時 24制 兩位 | 00..23 | 推薦使用 |
n | 分鐘 (不補零) | 0..59 | 注意:非 m |
nn | 分鐘兩位 | 00..59 | |
s | 秒數 (不補零) | 0..59 | |
ss | 秒數兩位 | 00..59 | |
z | 毫秒 (不補零) | 0..999 | |
zzz | 毫秒三位 | 000..999 | |
t | 短時間格式 | 11:22 | 等同 TimeToStr |
tt | 長時間格式 | 11:22:33 | |
am/pm | 上午/下午標記 | am, pm | 小寫 |
a/p | 單字母標記 | a, p | |
AM/PM | 大寫標記 | AM, PM | |
A/P | 大寫單字母 | A, P | |
/ | 日期分隔符 | / | 對應 FormatSettings.DateSeparator |
: | 時間分隔符 | : | 對應 FormatSettings.TimeSeparator |
'text' | 常值字串 | 'Year:' → Year: | 單引號包裹 |
uses SysUtils, DateUtils;
procedure TForm1.FormCreate(Sender: TObject);
var
D: TDateTime;
S: string;
Fmt: TFormatSettings;
begin
D := StrToDateTime('2009-5-21 11:22:33');
// 1. 預設區域格式
S := DateTimeToStr(D);
ShowMessage(S); // 2009/5/21 11:22:33 (視系統設定)
// 2. 自訂 FormatSettings (執行期切換格式)
GetLocaleFormatSettings(GetThreadLocale, Fmt);
Fmt.DateSeparator := '/';
Fmt.TimeSeparator := '_';
Fmt.ShortDateFormat := 'dd/mm/yyyy';
Fmt.ShortTimeFormat := 'hh:nn:ss';
S := DateTimeToStr(D, Fmt);
ShowMessage(S); // 21/05/2009 11_22_33
// 3. 完整自訂格式字串
DateTimeToString(S, 'yyyy"年"m"月"d"日" h"時"n"分"s"秒"', D);
ShowMessage(S); // 2009年5月21日 11時22分33秒
// 4. FormatDateTime 進階用法
S := FormatDateTime('yyyy-mm-dd hh:nn:ss.zzz', D); // 2009-05-21 11:22:33.000
S := FormatDateTime('"Week "ww", Day "d', D); // Week 21, Day 21
end;
'yyyy/mm/dd',應用 'yyyy' + DateSeparator + 'mm' + DateSeparator + 'dd' 或 FormatSettings。mm vs nn:m 系列為月份,n 系列為分鐘,極易混淆。yy 會依據 TwoDigitYearCenturyWindow 解釋世紀,跨世紀資料請用 yyyy。GetLocaleFormatSettings 取得當前執行緒 Locale,多執行緒環境下各執行緒可獨立設定。TFormatSettings 實例避免重複呼叫 GetLocaleFormatSettings。// ISO 8601 完整格式
FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz', Now); // 2024-01-15T14:30:45.123
// UTC 時區標記
FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz"Z"', UTCTime);
// 帶時區位移
FormatDateTime('yyyy-mm-dd"T"hh:nn:ss.zzz"+hh:nn"', LocalTime);
FormatDateTime 是 Delphi 日期時間格式化的瑞士刀。熟記核心代碼 (yyyy, mm, dd, HH, nn, ss, zzz),善用 TFormatSettings 隔離區域設定,即能輕鬆應對多國語系介面、標準化日誌、API 資料交換等各種情境。