使用 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!
其實是看地區選項中的「簡短日期」的設定,如下,
所以寫了測試程式來好好的測試看看,如下(畫面上拉了一個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上測試,資料呈現如下,
如果在zh-CN上測試,資料呈現如下,
那如果使用.NET 2.0來執行會發生什麼狀況呢?
如果在zh-TW上測試,資料呈現如下,
如果IFormatProvider參數給zh-CN的話,它顯示的格式還是yyyy/MM/dd
如果在zh-CN上測試,資料呈現如下,
如果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:從零開始的軟體開發生活」
請大家繼續支持 ^_^