這些天系統中發現DateTime.ToString()出來的Format和Sql Server可以吃的Format有點不一致.會導致數據庫不認DateTime而出錯.查了下MSDN,對DateTime的格式化問題有點體會.這裡就說一下.
由於文筆不好..就用123列出來好了.
1.DateTime默認是跟服務器當前的區域設置格式(就是當前服務器的文化Culture,其實數字的ToString也類似).
Date1
this.lblDate.Text = string.Format("當前默認Culture是:{0} <br />", System.Threading.Thread.CurrentThread.CurrentCulture.ToString()); this.lblDate.Text += string.Format("默認:<br/> {0}", DateTime.Now.ToString()); this.lblDate.Text += string.Format("<br/ > {0}", DateTime.Now.ToShortDateString()); this.lblDate.Text += string.Format("<br /> {0} <br /><br />", DateTime.Now.ToLongDateString());
如我們輸入上述代碼,在我本機上會顯示如下:
Date1R
當前默認Culture是:zh-CN
默認:
2008-12-12 11:30:47
2008-12-12
Ken的日歷2008年12月12日
看到最後一行的"Ken的日歷"麼?原因是因為我在控制面板的區域設置裡面把"LongDateFormat"改成了"'Ken的日歷'yyyy'年'M'月'd'日'".
2.如果在不改變當前線程的Culture的前提下,如果要用ToString("dd-MM-yyyy")來自定義格式.最好加上System.Globalization.DateTimeFormatInfo.InvariantInfo.如果不加上,可能還受當前Culture的影響.例如:
Date2
this.lblDate.Text += string.Format("{0} <br />", DateTime.Now.ToString("dd/MM/yyyy")); this.lblDate.Text += string.Format("{0} <br /><br />", DateTime.Now.ToString("dd/MM/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo));
結果是:
Date2R
12-12-2008 12/12/2008
原因就是在當前Culture(zh-CN)下,DateTime的DateSeparator是-而不是/.加上System.Globalization.DateTimeFormatInfo.InvariantInfo後,系統就會完全按照自定義格式來輸出.
3. DateTime格式是跟當前Thread的Cultrue設置,Thread類提供了CurrentCulture和CurrentUICulture,CurrentCulture用於設置格式化和排序的文化,CurrentUICulture用於設置用戶界面語言的文化,如果不設置,CurrentCulture默認跟系統的區域設置,CurrentUICulture默認跟操作系統語言,如果按照了多語言用戶界面,也跟系統區域設置.如果要定義全局Cultrue的話,可以在Web.Config裡面定義.我們這次測試,就直接在頁面上設置線程的Cultrue了.
Date3
System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("es-ES"); System.Threading.Thread.CurrentThread.CurrentCulture = ci; System.Threading.Thread.CurrentThread.CurrentUICulture = ci; this.lblDate.Text += string.Format("西班牙:<br/> {0}", DateTime.Now.ToString()); this.lblDate.Text += string.Format("<br/ > {0}", DateTime.Now.ToShortDateString()); this.lblDate.Text += string.Format("<br /> {0} <br /><br />", DateTime.Now.ToLongDateString());
經過上述的設置,ToString的輸出就會跟西班牙Culture的格式輸出.結果如下:
Date3R
西班牙:
12/12/2008 11:30:47 12/12/2008 viernes, 12 de diciembre de 2008
如果我們在運行上邊ToString("dd-MM-yyyy")的兩行代碼,就會得到如下結果:
Date3R2
12/12/2008 12/12/2008
因為西班牙的Cultrue的DateTime的DateSeparator是/而不是-.顯示出來就好像一致了..得到了我們想要的結果了!但是別忘了這只是巧合.
我們在把線程改成台灣的Cultrue來運行上述代碼看看會得到什麼:
Date4
ci = new System.Globalization.CultureInfo("zh-TW"); System.Threading.Thread.CurrentThread.CurrentCulture = ci; System.Threading.Thread.CurrentThread.CurrentUICulture = ci; // 經過上述設置,格式化和排序以及界面語言都會使用台灣文化. // this.lblDate.Text += string.Format("台灣:<br/> {0}", DateTime.Now.ToString()); this.lblDate.Text += string.Format("<br/ > {0}", DateTime.Now.ToShortDateString()); this.lblDate.Text += string.Format("<br /> {0} <br /><br />", DateTime.Now.ToLongDateString());
結果如下:
Date4R
台灣:
2008/12/12 上午 11:54:38 2008/12/12 2008年12月12日
4..Net還提供了DateTimeFormatInfo類來定義自己需要顯示的格式.
Date5
System.Globalization.DateTimeFormatInfo dtfi = new System.Globalization.DateTimeFormatInfo(); dtfi.DateSeparator = "-_-"; ci.DateTimeFormat = dtfi; System.Threading.Thread.CurrentThread.CurrentCulture = ci; System.Threading.Thread.CurrentThread.CurrentUICulture = ci; this.lblDate.Text += string.Format("自定義:<br/> {0}", DateTime.Now.ToString()); this.lblDate.Text += string.Format("<br/ > {0}", DateTime.Now.ToShortDateString()); this.lblDate.Text += string.Format("<br /> {0} <br /><br />", DateTime.Now.ToLongDateString()); this.lblDate.Text += string.Format("{0} <br />", DateTime.Now.ToString("dd/MM/yyyy")); this.lblDate.Text += string.Format("{0} <br /><br />", DateTime.Now.ToString("dd/MM/yyyy", System.Globalization.DateTimeFormatInfo.InvariantInfo));
得到的結果如下:
Date5R
自定義:
12-_-12-_-2008 11:54:38 12-_-12-_-2008 Friday, 12 December 2008 12-_-12-_-2008 12/12/2008
DateTimeFormatInfo類十分強大,可以讓你自定義你想要的格式,上邊我只是簡單的定義了DateSeparator,需要更多的設置,請參考MSDN好了.
相信經過上述的講解,你對DateTime.ToString一定有了一定的了解了吧.至於ToString裡面的參數格式化dmy等.就不多說了.網上一搜一大把.
其實,DateTime.ToString只是全球化和本地化問題的一個小知識點,如果需要跟多的學習,就要對System.Globalization NameSpace下的東西進行研究,我正在繼續看,你有興趣的話,也請努力吧!