為什麼會想寫這篇呢?因為我看到了這樣的程式碼:
以及
我不曉得,原來有很多的 .NET 程式設計師不知道 .NET Framework 已經提供了很好的日期時間處理方式。
具有文化特性的格式化
第一張圖想要呈現的是 1 Jan, 2016
這種格式的日期型式,我們要知道世界上不是只有 US 跟 TW 而已,有聽阿斯圖里亞斯公國嗎?有聽過巴斯克地區嗎?
不同的文化特性就會有不同的日期時間的表達方式,要做這樣的格式化在 .NET 真的非常簡單,只要從自訂日期和時間格式字串找到我們要輸出的格式字串,組合好後再到 Table of Language Culture Names, Codes, and ISO Values (PIA) 找到對應的 Language Culture Name
,呼叫熟悉的 DateTime.Now.ToString() 就搞定了。
執行結果
時區的轉換
如果我們想要在不同時區做轉換,最常看到的一個蠻不好的寫法是 DateTime.Now.AddHours(n)
,這種寫法最常遇到的麻煩是要轉換有實施日光節約時間的時區,還有顯示的時區會不正確。
可以看到顯示的時區資訊都是 GMT+08:00
,就算 -12 小時,它還是台灣時間。
要轉換時間得先從 Time Zone IDs (Compact 2013) 找到想要轉換的 Time zone name
,接著呼叫 TimeZoneInfo.ConvertTime()
就可以輕鬆轉換了。
可以看到時區資訊變成 GMT-04:00,這才是正港的美國東部目前的時間。
TimeZoneInfo.FindSystemTimeZoneById() 要給的參數是 Time zone name,不要被 FindSystemTimeZoneById 這個方法名稱給迷惑了。
同場加映 - 不同文化特性的星期名稱
前同事暴走的程式碼…,寫了一篇【新手入門】取得不同語系的星期名稱,想知道如何依照不同文化特性取得星期名稱的朋友,可以參考這篇。