[.NET]使用DateTime.ToString(String, IFormatProvider),IFormatProvider參數給null的問題

使用 DateTime.Now.ToString("yyyy/MM/dd" , null),在zh-CN的OS中,顯示出來的卻是yyyy-MM-dd?

環境: .NET 1.1

前陣子有段處理日期的程式在簡體(zh-CN)的環境上居然發生錯誤!

而那段取得日期的程式如下,

string d1 = DateTime.Now.ToString("yyyy/MM/dd" , null);

 

日期為2013/10/28,在zh-TW的OS中顯示出來的是2013/10/28。

但在zh-CN的OS中,顯示出來的卻是2013-10-28!

所以程式中以DateTime.ParseExact("2013-10-28", "yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture)一處理下去,就馬上發生「字串未被辨認為有效的 DateTime。」的錯誤!

而查看了一下,DateTime.Now.ToString("yyyy/MM/dd" , null)中,如果IFormatProvider參數給null的話,它會用CurrentThread.CurrentCulture。

而在.NET 1.1中,DateTime.ToString(String, IFormatProvider) 的IFormatProvider參數如果給CultureInfo("zh-CN"),預設顯示出來就會變成yyyy-MM-dd!

其實是看地區選項中的「簡短日期」的設定,如下,

image

 

所以寫了測試程式來好好的測試看看,如下(畫面上拉了一個Button(name:button1)及ListBox控制項(name:listBox1)),

private void button1_Click(object sender, System.EventArgs e)
{
	string d0 = DateTime.Now.ToString("yyyy/MM/dd");
	string d1 = DateTime.Now.ToString("yyyy/MM/dd" , null);
	string d2 = DateTime.Now.ToString("yyyy/MM/dd", System.Globalization.CultureInfo.InvariantCulture);
	string d3 = DateTime.Now.ToString("yyyy/MM/dd", System.Threading.Thread.CurrentThread.CurrentCulture);
	string d4 = DateTime.Now.ToString("yyyy/MM/dd", new System.Globalization.CultureInfo("zh-CN"));
	string d5 = DateTime.Now.ToString("yyyy/MM/dd", new System.Globalization.CultureInfo("zh-TW"));
	string d6= DateTime.Now.ToString("yyyy/MM/dd", new System.Globalization.CultureInfo("en-US"));
	string currCultureName = System.Threading.Thread.CurrentThread.CurrentCulture.Name;
	listBox1.Items.Clear();
	listBox1.Items.Add(string.Format("d0:{0}", d0));
	listBox1.Items.Add(string.Format("d1:null:{0}", d1));
	listBox1.Items.Add(string.Format("d2:InvariantCulture:{0}", d2));
	listBox1.Items.Add(string.Format("d3:{0}:{1}", currCultureName, d3));
	listBox1.Items.Add(string.Format("d4:zh-CN:{0}", d4));
	listBox1.Items.Add(string.Format("d5:zh-TW:{0}", d5));
	listBox1.Items.Add(string.Format("d6:en-US:{0}", d6));
}

 

如果在zh-TW上測試,資料呈現如下,

image

 

如果在zh-CN上測試,資料呈現如下,

image

 

那如果使用.NET 2.0來執行會發生什麼狀況呢?

如果在zh-TW上測試,資料呈現如下,

image

如果IFormatProvider參數給zh-CN的話,它顯示的格式還是yyyy/MM/dd

 

如果在zh-CN上測試,資料呈現如下,

image

如果IFormatProvider參數給zh-CN的話,它顯示的格式就變成了yyyy-MM-dd

 

結論

即使Format有指定"yyyy/MM/dd",如果CultureInfo為zh-CN的話,預設顯示出來就會變成yyyy-MM-dd(其實是看地區選項中的「簡短日期」的設定)!

而使用DateTime.ToString(String)或DateTime.ToString(String, IFormatProvider) IFormatProvider參數給null的話,就有可能取到非預值的值,而導致程式發生錯誤。

所以,如果是為了想要有預期的DateTime Format的話,請使用DateTime.ToString(String, IFormatProvider),而IFormatProvider參數就給System.Globalization.CultureInfo.InvariantCulture吧!

 

參考資料

DateTime.ToString(String, IFormatProvider)

DateTime.ParseExact(String, String, IFormatProvider)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^