http://www.cnblogs.com/longsan/archive/2006/04/05/367462.html
今天有網友在q群上貼了如下一段代碼:
strings=Calendar1.TodaysDate.ToString("d");
想得到"MM/dd/yyyy"的顯示方式,可是總是顯示成"04-01-2006",而不是想要的"04/01/2006"。
一開始我也想當然的認為"MM/dd/yyyy" (自訂格式字串)或者用"d"
(標準格式字串)來完成,但是經過實驗,發現總是顯示"04-01-2006"。後來查了協助,對這個問題有了下面的一些認識:
1、標準格式字串的顯示是與程式運行機器上的本地地區有關的,即與CultrueInfo相關。比如你的機器上的本地地區設定裡,設定日期之間的間隔符是"-",那麼你通過上述代碼顯示的總是"-",除非你修改了本地地區的設定。
2、上述代碼預設的美國英語的顯示方式是"04/01/2006",中文的顯示方式是"04-01-2006",德語的顯示方式是"04.01.2006"。
3、如果不通過修改本地地區的設定,而想實現"04/01/2006"的顯示方式,則應該使用自訂格式字串,上面的代碼可以寫成下面這樣:
strings=Calendar1.TodaysDate.ToString("MM'/'dd'/'yyyy");
其中兩個單引號括著的是任一字元串,在顯示時都會直接顯示。
幾種解決方案:
第一種如上面3所說的。
第二種
Web.Config中,添加:
<globalization requestEncoding="utf-8" responseEncoding="utf-8"culture="zh-CN"/>
這是最方便的,但是沒有試.
第三種
控制台-〉地區選項-〉自訂(時間右邊的按鈕)
可以,不過沒有移植性.
關於一些資料參考:
日期格式化顯示
在SQL中DateTime為8位長度日期的指定形式為2003-12-31 00:00:00
而在ASP.NET上最常用的只是2003-12-31號一部分而已你可以使用
DateTime.Now.ToString("d")或DateTime.Now.ToShortDateString();
不過具體格式是2003/12/31還是2003-12-31的話要看你的系統配置日期配置是哪一種.
你要想確定取得2003-12-31指定的話使用.Tostring()使用者自訂格式
格式的字元可以看上面說到的文檔.
如.ToString("yyyy-MM-dd")返回2003-11-25
.ToString("yyyyMMdd")返回20031125
d 將日顯示為不帶前置字元為零的數字(如 1)。如果這是使用者定義的數字格式中的唯一字元,請使用
%d。
dd 將日顯示為帶前置字元為零的數字(如 01)。
ddd 將日顯示為縮寫形式(例如 Sun)。
dddd 將日顯示為全名(例如 Sunday)。
M 將月份顯示為不帶前置字元為零的數字(如一月表示為 1)。如果這是使用者定義的數字格式中的唯一
字元,請使用 %M。
MM 將月份顯示為帶前置字元為零的數字(例如 01/12/01)。
MMM 將月份顯示為縮寫形式(例如 Jan)。
MMMM 將月份顯示為完整月份名(例如 January)。
gg 顯示時代/紀元字串(例如 A.D.)
h 使用 12 小時制將小時顯示為不帶前置字元為零的數字(例如 1:15:15 PM)。如果這是使用者定義的數
字格式中的唯一字元,請使用 %h。
hh 使用 12 小時制將小時顯示為帶前置字元為零的數字(例如 01:15:15 PM)。
H 使用 24 小時制將小時顯示為不帶前置字元為零的數字(例如 1:15:15)。如果這是使用者定義的數字
格式中的唯一字元,請使用 %H。
HH 使用 24 小時制將小時顯示為帶前置字元為零的數字(例如 01:15:15)。
m 將分鐘顯示為不帶前置字元為零的數字(例如 12:1:15)。如果這是使用者定義的數字格式中的唯一字
符,請使用 %m。
mm 將分鐘顯示為帶前置字元為零的數字(例如 12:01:15)。
s 將秒顯示為不帶前置字元為零的數字(例如 12:15:5)。如果這是使用者定義的數字格式中的唯一字元
,請使用 %s。
ss 將秒顯示為帶前置字元為零的數字(例如 12:15:05)。
F 顯示秒的小數部分。例如,ff 將精確顯示到百分之一秒,而 ffff 將精確顯示到萬分之一秒。
使用者定義格式中最多可使用七個 f 符號。如果這是使用者定義的數字格式中的唯一字元,請使用 %f。
T 使用 12 小時制,並對中午之前的任一小時顯示大寫的 A,對中午到 11:59 P.M 之間的任一小
時顯示大寫的 P。如果這是使用者定義的數字格式中的唯一字元,請使用 %t。
tt 使用 12 小時制,並對中午之前任一小時顯示大寫的 AM;對中午到 11:59 P.M 之間的任一小
時顯示大寫的 PM。
y 將年份 (0-9) 顯示為不帶前置字元為零的數字。如果這是使用者定義的數字格式中的唯一字元,請使用
%y。
yy 以帶前置字元為零的兩位元字格式顯示年份(如果適用)。
yyy 以四位元字格式顯示年份。
yyyy 以四位元字格式顯示年份。
z 顯示不帶前置字元為零的時區位移量(如 -8)。如果這是使用者定義的數字格式中的唯一字元,請使用
%z。
zz 顯示帶前置字元為零的時區位移量(例如 -08)
zzz 顯示完整的時區位移量(例如 -08:00)
同樣對時間也可以進行這樣的格式化..你可以使用自訂格式來設定你想要的格式輸出.
你可以使用上表中各字元進行任意的組合不管前後次序多少如你寫入yyyy-yyyy也是可以的.
注意的是:進行格式化的一定要是日期DateTime格式.在SQL中的類型也一樣.否則格式無效或出錯.特別是在DataGrid常{0:IFromat}的格式中會用到
2)日期的輸入
我們在辦理入日期格式式常用DateTime.Pares()
但是這個形式的轉換是相當有限的,有些C#是會不懂你寫入的日期格式的如20031231大家都明白是2003-
12-31號可以C#不認識他.我們可以這樣子進行如下
//設定語言國家
System.IFormatProvider format=new System.Globalization.CultureInfo("zh-CN",true);
//指定轉換格式
Response.Write(DateTime.ParseExact(this.TextBox1.Text,"yyyyMMdd",format));
這樣他就能看出20031231號的日期格式了
不過可惜他只能夠對yyyyMMdd形式進行不能對其它格式進行轉換是不是美中不足?
不過.NET提供了另一種重載版本.
public static DateTime ParseExact(string, string[], IFormatProvider, DateTimeStyles);
可對指定的幾種日期格式進行轉換.