程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> DateTime.ToString格式化問題

DateTime.ToString格式化問題

編輯:關於.NET

這些天系統中發現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下的東西進行研究,我正在繼續看,你有興趣的話,也請努力吧!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved