DateTime.ToString格式化问题

时间:2022-07-07 02:25:23

这些天系统中发现DateTime.ToString()出来的Format和Sql Server可以吃的Format有点不一致.会导致数据库不认DateTime而出错.查了下MSDN,对DateTime的格式化问题有点体会.这里就说一下.

由于文笔不好..就用123列出来好了.

1.DateTime默认是跟服务器当前的区域设置格式(就是当前服务器的文化Culture,其实数字的ToString也类似).

 

DateTime.ToString格式化问题DateTime.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());

 

如我们输入上述代码,在我本机上会显示如下:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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的影响.例如:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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));

 

结果是:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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了.

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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的格式输出.结果如下:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题Date3R
西班牙:
12/12/2008 11:30:47
12/12/2008
viernes, 12 de diciembre de 2008 

 

如果我们在运行上边ToString("dd-MM-yyyy")的两行代码,就会得到如下结果:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题Date3R2
12/12/2008 
12/12/2008 

 

因为西班牙的Cultrue的DateTime的DateSeparator是/而不是-.显示出来就好像一致了..得到了我们想要的结果了!但是别忘了这只是巧合.

我们在把线程改成*的Cultrue来运行上述代码看看会得到什么:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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());

 

结果如下:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题Date4R
*:
2008/12/12 上午 11:54:38
2008/12/12
2008年12月12日 

 

4..Net还提供了DateTimeFormatInfo类来定义自己需要显示的格式.

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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));

 

得到的结果如下:

 

DateTime.ToString格式化问题DateTime.ToString格式化问题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下的东西进行研究,我正在继续看,你有兴趣的话,也请努力吧!