DateTime.ToString 兩大格式體系
| 體系 | 格式字串 | 說明 | 範例 (2024-05-20 14:30:05) |
標準格式 (單一字元) | d | 短日期 | 2024/05/20 |
| D | 長日期 | 2024年5月20日 |
| f | 完整日期短時間 | 2024年5月20日 下午 02:30 |
| F | 完整日期長時間 | 2024年5月20日 下午 02:30:05 |
| g | 一般短日期短時間 | 2024/05/20 下午 02:30 |
| G | 一般短日期長時間 | 2024/05/20 下午 02:30:05 |
| M/m | 月日 | 5月20日 |
| R/r | RFC1123 | Mon, 20 May 2024 14:30:05 GMT |
| s | 可排序 (ISO 8601) | 2024-05-20T14:30:05 |
| t | 短時間 | 下午 02:30 |
| T | 長時間 | 下午 02:30:05 |
| u | 通用可排序 (UTC) | 2024-05-20 14:30:05Z |
| U | 完整日期長時間 (UTC) | 2024年5月20日 上午 06:30:05 |
| Y/y | 年月 | 2024年5月 |
自訂格式字串(區分大小寫)
| 格式 | 意義 | 範例 |
| d | 日 (無前導零) | 5 |
| dd | 日 (兩位數) | 05 |
| ddd | 星期縮寫 | 一 |
| dddd | 星期全名 | 星期一 |
| M | 月 (無前導零) | 5 |
| MM | 月 (兩位數) | 05 |
| MMM | 月份縮寫 | 五月 |
| MMMM | 月份全名 | 五月 |
| y | 年 (無紀元, 無前導零) | 24 |
| yy | 年 (無紀元, 兩位數) | 24 |
| yyyy | 年 (四位數) | 2024 |
| h | 12小時制 (無前導零) | 2 |
| hh | 12小時制 (兩位數) | 02 |
| H | 24小時制 (無前導零) | 14 |
| HH | 24小時制 (兩位數) | 14 |
| m | 分 (無前導零) | 30 |
| mm | 分 (兩位數) | 30 |
| s | 秒 (無前導零) | 5 |
| ss | 秒 (兩位數) | 05 |
| f~fffffff | 秒小數 1~7 位 | .1234567 |
| t | AM/PM 首字 | 上 |
| tt | AM/PM 完整 | 下午 |
| z | 時區時差 (小時) | +8 |
| zz | 時區時差 (兩位數小時) | +08 |
| zzz | 時區時差 (時:分) | +08:00 |
| : | 時間分隔符 (依文化) | : |
| / | 日期分隔符 (依文化) | / |
| 'text' 或 \c | 字面文字 | '年' → 年 |
實用組合範例
var dt = new DateTime(2024, 5, 20, 14, 30, 5);
// 常見需求
dt.ToString("yyyyMMdd") // 20240520 (檔名、資料庫鍵值)
dt.ToString("yyyy-MM-dd") // 2024-05-20 (ISO 日期)
dt.ToString("yyyy/MM/dd HH:mm") // 2024/05/20 14:30 (日誌)
dt.ToString("yyyy年MM月dd日") // 2024年05月20日 (中文顯示)
dt.ToString("HH:mm:ss.fff") // 14:30:05.123 (高精度時間)
dt.ToString("yyyy-MM-ddTHH:mm:ss.fffZ", CultureInfo.InvariantCulture) // UTC ISO 8601
// 指定文化特性 (避免伺服器文化差異導致格式錯誤)
dt.ToString("D", new CultureInfo("zh-TW")) // 2024年5月20日 星期一
dt.ToString("D", CultureInfo.InvariantCulture) // Monday, May 20, 2024
最佳實務
- 永遠指定 CultureInfo: 生產環境建議用
CultureInfo.InvariantCulture 或明確指定 new CultureInfo("zh-TW"),避免伺服器區域設定不同導致格式錯誤。
- 儲存/傳輸用 ISO 8601:
"o" (Round-trip) 或 "yyyy-MM-ddTHH:mm:ss.fffZ" (UTC),可無損往返解析。
- 解析用 TryParseExact: 避免例外,明確指定預期格式。
- .NET 6+ 建議: 使用
DateOnly/TimeOnly 分離日期時間,語意更清晰。
常見陷阱
mm 是分鐘,MM 才是月份 —— 寫錯最常見。
yyyy vs YYYY:後者為週曆年,跨年週會不同,慎用。
- 單一字元自訂格式需加
% 前綴:"%d" 才不被視為標準格式 "d"。