source:http://blog.darkthread.net/blogs/darkthreadtw/archive/2007/04/30/tips-net-datetime-formating.aspx
在VB/VBScript時代,講到日期時間輸出的格式化,大家都知道要用Format(for VB)或FormatDateTime(fro VBScript)。到了.NET時代,有些VB.NET開發者會繼續沿用Format函數。事實上,DateTime Class本身就提供輸出格式化的支援,不用另外呼叫函數處理,而且對C#或VB.NET都通用。
以將日期時間轉成字串為例,DateTime.Now.ToString()大家都會,但有個缺點。未指定任何參數的ToString(),輸出的日期時間格式將會依當時Windows的國別設定而定! 這種因地制宜的做法可以讓Windows Form的User倍感親切,也可算優點,但日期格式的不一致,常會因顯示長度不一造成版面配置的困擾,也是資料庫日期格式轉換出鎚的重要來源。所以我比較習慣應用系統內部使用統一的格式,不要受OS層次響。如果User要做到個人化,再由統一格式轉換過去。我最慣用的格式是"2007/04/30 21:30:00",沒有千禧問題,字串長度永遠固定,24小時制則不必在AM/PM vs 上午/下午間掙札,用來最順手。
不過這個格式並不在.NET預設的標準日期時間格式之列,要產生這個格式,需要自己用yyyy, mm, dd去定義。.NET所提供的客製化日期時間格式字串十分完整,所以用DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")就可以產生我們要的結果,連string.Format函數都用不到。
除了由DateTime -> String的轉換,若要把奇奇怪怪的日期時間字串換回DateTime,.NET也提供了同樣強大的客製彈性! 簡單來說,你可以怎麼把DateTime轉成String,就可以再怎麼把String轉成DateTime,只要提供同樣的日期時間格式字串就得了。例如:
string s="04/30, 2007 @ 09:30"; //某個變態想出來的怪格式
DateTime d=DateTime.ParseExact(s, "MM/dd, yyyy @ HH:mm", null); //照樣解得回來
很酷吧!
最後補充一點,DateTime.ParseExact的第三個參數是IFormatProvider,在以上的例子中用不到,傳null就可以了。但如果你有用到AM/PM(中文是上午、下午)、星期、月份全名... 等等各國表示不同的資料,IFormatProvider就會有影響。
例如: 在中文OS下
DateTime.ParseExact("09:20:00 AM","HH:mm:ss tt", null) 會產生 String was not recognized as a valid DateTime.的訊息。
以上的問題出在中文OS的國別設定中預設用中文表示上下午,導致ParseExact看不懂AM/PM。因此我們得改在IFormatProvider傳入使用AM/PM表示上下午的CultureInfo,en-US當然可以,不過我倒較常用InvariantCulture。改寫成以下方式就OK囉!
DateTime.ParseExact("09:20:00 AM","HH:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture)