[食譜好菜] DateTime 具有文化特性的格式化及時區的轉換

  • 2265
  • 0
  • C#
  • 2018-04-09

為什麼會想寫這篇呢?因為我看到了這樣的程式碼:

以及

我不曉得,原來有很多的 .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 這個方法名稱給迷惑了。

同場加映 - 不同文化特性的星期名稱

前同事暴走的程式碼…,寫了一篇【新手入門】取得不同語系的星期名稱,想知道如何依照不同文化特性取得星期名稱的朋友,可以參考這篇。

相關資源

C# 指南
ASP.NET 教學
ASP.NET MVC 指引
Azure SQL Database 教學
SQL Server 教學
Xamarin.Forms 教學