DateTime.ToString格式化问题

mac2022-06-30  70

这些天系统中发现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:472008-12-12Ken的日历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:4712/12/2008viernes, 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:382008/12/122008年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:3812-_-12-_-2008Friday, 12 December 2008 12-_-12-_-2008 12/12/2008 

 

DateTimeFormatInfo类十分强大,可以让你自定义你想要的格式,上边我只是简单的定义了DateSeparator,需要更多的设置,请参考MSDN好了.

相信经过上述的讲解,你对DateTime.ToString一定有了一定的了解了吧.至于ToString里面的参数格式化dmy等.就不多说了.网上一搜一大把.

其实,DateTime.ToString只是全球化和本地化问题的一个小知识点,如果需要跟多的学习,就要对System.Globalization NameSpace下的东西进行研究,我正在继续看,你有兴趣的话,也请努力吧!

转载于:https://www.cnblogs.com/KenBlove/archive/2008/12/12/1353591.html

相关资源:JAVA上百实例源码以及开源项目
最新回复(0)