首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

DateTime.ToString 格式化陷阱與 CultureInfo 最佳實務

     編輯:關於.NET

預設行為:追隨執行緒 Culture

DateTime.ToString() 無參數呼叫時,格式由 Thread.CurrentThread.CurrentCulture 決定。伺服器區域設定不同,輸出格式即不同,導致資料庫寫入失敗或解析錯誤。

自訂格式字串仍受 Culture 影響

// 當前 Culture 為 zh-CN,日期分隔符為 '-'
DateTime.Now.ToString("dd/MM/yyyy")  // 輸出 "12-12-2008" 而非 "12/12/2008"

因格式字串中的 / 會被解析為當前 Culture 的日期分隔符。

正確做法:指定 InvariantCulture

DateTime.Now.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture)  // 固定輸出 "12/12/2008"

CultureInfo.InvariantCulture (等同 DateTimeFormatInfo.InvariantInfo) 保證格式字串字面解析,不受系統區域干擾。

全域變更執行緒 Culture(慎用)

var ci = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
// 後續 ToString() 將依西語格式輸出

或在 web.config 設定 <globalization culture="es-ES" uiCulture="es-ES" /> 套用全站。

自訂 DateTimeFormatInfo

var dtfi = new DateTimeFormatInfo { DateSeparator = "-_-" };
var ci = new CultureInfo("zh-TW") { DateTimeFormat = dtfi };
Thread.CurrentThread.CurrentCulture = ci;
DateTime.Now.ToString("dd/MM/yyyy")  // 輸出 "12-_-12-_-2008"

適用於極度客製化輸出格式的需求。

最佳實務總結

  • 持久化/傳輸/日誌:永遠使用 InvariantCulture 或 ISO 8601 (yyyy-MM-ddTHH:mm:ss)。
  • UI 顯示:尊重使用者 CurrentUICulture,使用 ToShortDateString() 等當地化方法。
  • 解析輸入:DateTime.ParseExact(input, "yyyy-MM-dd", CultureInfo.InvariantCulture)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved