DateTime.ToString() 無參數呼叫時,格式由 Thread.CurrentThread.CurrentCulture 決定。伺服器區域設定不同,輸出格式即不同,導致資料庫寫入失敗或解析錯誤。
// 當前 Culture 為 zh-CN,日期分隔符為 '-'
DateTime.Now.ToString("dd/MM/yyyy") // 輸出 "12-12-2008" 而非 "12/12/2008"
因格式字串中的 / 會被解析為當前 Culture 的日期分隔符。
DateTime.Now.ToString("dd/MM/yyyy", CultureInfo.InvariantCulture) // 固定輸出 "12/12/2008"
CultureInfo.InvariantCulture (等同 DateTimeFormatInfo.InvariantInfo) 保證格式字串字面解析,不受系統區域干擾。
var ci = new CultureInfo("es-ES");
Thread.CurrentThread.CurrentCulture = ci;
Thread.CurrentThread.CurrentUICulture = ci;
// 後續 ToString() 將依西語格式輸出
或在 web.config 設定 <globalization culture="es-ES" uiCulture="es-ES" /> 套用全站。
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)。CurrentUICulture,使用 ToShortDateString() 等當地化方法。DateTime.ParseExact(input, "yyyy-MM-dd", CultureInfo.InvariantCulture)。