这些天系统中发现DateTime.ToString()出来的Format和Sql Server可以吃的Format有点不一致.会导致数据库不认DateTime而出错.查了下MSDN,对DateTime的格式化问题有点体会.这里就说一下.
由于文笔不好..就用123列出来好了.
1.DateTime默认是跟服务器当前的区域设置格式(就是当前服务器的文化Culture,其实数字的ToString也类似).
如我们输入上述代码,在我本机上会显示如下:
默认:
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的影响.例如:
结果是:
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了.
经过上述的设置,ToString的输出就会跟西班牙Culture的格式输出.结果如下:
12/12/2008 11:30:47
12/12/2008
viernes, 12 de diciembre de 2008
如果我们在运行上边ToString("dd-MM-yyyy")的两行代码,就会得到如下结果:
12/12/2008
因为西班牙的Cultrue的DateTime的DateSeparator是/而不是-.显示出来就好像一致了..得到了我们想要的结果了!但是别忘了这只是巧合.
我们在把线程改成台湾的Cultrue来运行上述代码看看会得到什么:
结果如下:
2008/12/12 上午 11:54:38
2008/12/12
2008年12月12日
4..Net还提供了DateTimeFormatInfo类来定义自己需要显示的格式.
得到的结果如下:
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下的东西进行研究,我正在继续看,你有兴趣的话,也请努力吧!