菜雞抓蟲: DateTime.ToString() 之我們不一樣 & CultureInfo 文化特性小筆記
事發緣由
咱們內部套件中有個方法,會將各個參數組合為 QueryString 去打指定的 Api。就是這麼稀鬆平常的場景,神奇的事情就發生了。
同樣的套件、同樣的語法,在團隊中兩個人的電腦上安裝執行,卻是一個成功一個失敗。
原來該方法的參數中,包含一欄型別為 DateTime 的資料,並且會把該欄位的值拿來 ToString() 再做為參數傳遞給目標 Api。
而呼叫失敗的人就是在這個 DateTime.ToString()
的過程中產生了中文字,使得目標 Api 接到參數後,無法將中文字轉換回 DateTime 而發生了錯誤。
問題就浮現了:同一行 DateTime.ToString() 在不同電腦執行的結果竟然不一樣?!
為了讓我們更快了解狀況,現在就簡單地使用 Linqpad 進行測試:
void Main()
{
DateTime.Now.ToString().Dump();
}
首先,在我的 Windows 時間設定中,完整時間的格式為 09:40:07
,也就是 24 小時制。
現在讓我們先執行上面這段語法看看:
// 2021/10/04 21:00:00
接著讓我們變更時間格式看看。
以我的 Win10 為例,在 Windows 工具列,也就是畫面的右下角右鍵,選擇 調整日期時間 → 日期時間格式設定 → 變更資料格式
,將時間格式變更為 上午 09:40:07
。
重新啟動 Linqpad 再執行如下:
// 2021/10/04 下午 09:00:00
可以看到 下午
兩個字就蹦出來了!
之所以會有這樣的差異,是因為 DateTime.ToString()
預設轉換的目標格式會是抓取目前執行緒的文化特性。