[轉貼] 利用 DateTime.ParseExact 將字串轉回 DateTime 格式

2013041617:46

出處:http://www.allenkuo.com/genericArticle/view222.aspx

利用 DateTime.ParseExact 將字串轉回 DateTime 格式

By Allen Kuo, 建立日期:2008/03/19 15:26 ,最後修改日期:2008/10/24 09:48
DateTime 型別轉成 string 比較沒什麼問題, 字串轉回 DateTime 除了用Convert.ToDateTime之外, 也可以用DateTime.ParseExact()

  1. string s="04/30, 2007 @ 09:30"; //某個變態想出來的怪格式
  2. 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)



在使用者輸入內容後,從 TextBox 中取出來的字串,不見得符合你的預期的格式,有可能字串前、中、後多了一些空白、有可能 24 小時制與 12 小時制搞混寫錯了,有可能寫【AM 與 PM】而不是【上午與下午】。

幸好 DateTime.ParseExact() 可以做到相當相當地彈性,例如:

string[] DateTimeList = { 
                            "yyyy/M/d tt hh:mm:ss", 
                            "yyyy/MM/dd tt hh:mm:ss", 
                            "yyyy/MM/dd HH:mm:ss", 
                            "yyyy/M/d HH:mm:ss", 
                            "yyyy/M/d", 
                            "yyyy/MM/dd" 
                        }; 
 
DateTime dt = DateTime.ParseExact(" 2008/  3/18   PM 02: 50:23  ", 
                                  DateTimeList, 
                                  CultureInfo.InvariantCulture, 
                                  DateTimeStyles.AllowWhiteSpaces
                                  ); 


宣告一個 String 陣列 DateTimeList,內容值放置所有預期會客制化的日期格式,以符合各種字串來源;使用 CultureInfo.InvariantCulture 解析各種國別不同地區設定;使用 DateTimesStyles.AllowWhiteSpaces 忽略字串一些無意義的空白。如此一來,即使像 " 2008/3 /18 PM 02: 50:23 " 這麼醜陋的字串,也可以成功轉到成 DateTime 型態。