这些天系统中发现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上百实例源码以及开源项目