日期時間格式化是 ASP.NET 開發中最高頻的操作之一。本文系統整理 6 大核心格式化方法,並附贈 標準/自定義格式字符完整速查表,助你應對各種顯示、綁定、序列化場景。
最推薦用於數據展示層,關注點分離,無需後台代碼。
<!-- BoundField / BoundColumn -->
<asp:BoundField DataField="CreateTime" HeaderText="創建時間"
DataFormatString="{0:yyyy-MM-dd HH:mm}" HtmlEncode="false" />
<!-- TemplateField 內 Eval -->
<asp:TemplateField HeaderText="更新時間">
<ItemTemplate>
<%# Eval("UpdateTime", "{0:yyyy/MM/dd}") %>
</ItemTemplate>
</asp:TemplateField>
適用於代碼後台動態構建模板或複雜邏輯判斷。
// 後台代碼
string formatted = DataBinder.Eval(dataItem, "OrderDate", "{0:yyyy年MM月dd日}");
// 或直接在 .aspx 內
<%# DataBinder.Eval(Container.DataItem, "ShipDate", "{0:d}") %>
所有格式化的核心,支援標準/自定義格式字符,效能最優。
DateTime now = DateTime.Now;
now.ToString("yyyy-MM-dd"); // 2024-01-15
now.ToString("yyyy-MM-dd HH:mm:ss"); // 2024-01-15 14:30:05
now.ToString("yyyy/MM/dd HH:mm"); // 2024/01/15 14:30
now.ToString("yyyy年MM月dd日"); // 2024年01月15日(中文場景)
// String.Format
string log = String.Format("用戶 {0} 於 {1:yyyy-MM-dd HH:mm} 登入", userName, loginTime);
// C# 6+ 插值字符串(推薦,編譯期檢查)
string log = $"用戶 {userName} 於 {loginTime:yyyy-MM-dd HH:mm} 登入";
處理用戶輸入、外部 API 返回的字符串日期。
string input = "2024-01-15 14:30:00";
if (DateTime.TryParse(input, out DateTime dt))
{
string output = dt.ToString("yyyy/MM/dd");
}
// 含文化特定格式
DateTime.ParseExact("15/01/2024", "dd/MM/yyyy", CultureInfo.InvariantCulture);
適用於確信非 null 的數據庫字段、ViewState、Session 取值。
object val = Session["LastLogin"];
if (val != null)
{
DateTime dt = Convert.ToDateTime(val);
string fmt = dt.ToString("yyyy-MM-dd");
}
| 字符 | 名稱 | 範例輸出 (en-US) | 說明 |
|---|---|---|---|
| d | 短日期 | 1/15/2024 | ShortDatePattern |
| D | 長日期 | Monday, January 15, 2024 | LongDatePattern |
| f | 完整日期短時間 | Monday, January 15, 2024 2:30 PM | LongDate + ShortTime |
| F | 完整日期長時間 | Monday, January 15, 2024 2:30:05 PM | FullDateTimePattern |
| g | 常規短時間 | 1/15/2024 2:30 PM | ShortDate + ShortTime |
| G | 常規長時間 | 1/15/2024 2:30:05 PM | ShortDate + LongTime |
| M/m | 月日 | January 15 | MonthDayPattern |
| R/r | RFC1123 | Mon, 15 Jan 2024 14:30:05 GMT | HTTP/Email 標準 |
| s | 可排序 | 2024-01-15T14:30:05 | ISO 8601 本地時間 |
| t | 短時間 | 2:30 PM | ShortTimePattern |
| T | 長時間 | 2:30:05 PM | LongTimePattern |
| u | 通用可排序 | 2024-01-15 14:30:05Z | UTC 時間,ISO 8601 |
| U | 完整 UTC | Monday, January 15, 2024 6:30:05 AM | LongDate + LongTime (UTC) |
| Y/y | 年月 | January, 2024 | YearMonthPattern |
| 字符 | 含義 | 範例 |
|---|---|---|
| yyyy | 四位年份 | 2024 |
| yy | 兩位年份 | 24 |
| MM | 兩位月份 | 01 |
| M | 不補零月份 | 1 |
| MMM | 月份縮寫 | Jan |
| MMMM | 月份全名 | January |
| dd | 兩位日期 | 15 |
| d | 不補零日期 | 15 |
| ddd | 星期縮寫 | Mon |
| dddd | 星期全名 | Monday |
| HH | 24小時制兩位 | 14 |
| H | 24小時制不補零 | 14 |
| hh | 12小時制兩位 | 02 |
| mm | 兩位分鐘 | 30 |
| ss | 兩位秒 | 05 |
| fff | 毫秒三位 | 123 |
| tt | AM/PM | PM |
| zz | 時區偏移小時 | +08 |
| zzz | 時區偏移完整 | +08:00 |
| \\ | 轉義字面量 | yyyy\\年 → 2024年 |
| 'text' | 單引號包裹字面量 | yyyy'年' → 2024年 |
CultureInfo.CurrentCulture = new CultureInfo("zh-CN") 或在 web.config `DateTime.UtcNow,顯示時轉換至用戶時區:TimeZoneInfo.ConvertTimeFromUtc(utc, userTimeZone)。DateFormats.ShortDate = "yyyy-MM-dd",統一維護。o (Round-trip) 或 s 格式:dt.ToString("o") → 2024-01-15T14:30:05.1234567+08:00。ToString 比 String.Format 快 2-3 倍,高頻日誌記錄優先用 ToString。| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
ToString("YYYY-MM-dd") | YYYY 是週年,跨年週會導致年份錯誤 | ToString("yyyy-MM-dd") |
ToString("mm") | mm 是分鐘,非月份 | ToString("MM") |
ToString("hh:mm") | 12小時制無 AM/PM 會混淆 | ToString("HH:mm") 或 ToString("hh:mm tt") |
String.Format("{0:D}", dt) 配合 zh-CN | 長日期格式過長(2024年1月15日 星期一) | 改用自定義 "yyyy年M月d日" |
掌握 ToString 自定義格式 為核心,配合 DataFormatString 聲明式綁定、ISO 8601 序列化、UTC 儲存+時區轉換 顯示,即可覆蓋 100% ASP.NET 日期時間格式化場景。