none
DateTime.Parse 转化时间之后时间差12小时,13点以后的就转化不了 RRS feed

  • 问题

  • 背景:操作系统中文版2003 service,.net 2.0

    webservice项目中的部分代码:DateTime dt=DateTime.Parse('2014-03-02 12:34:45')

    情况:正常情况下,时间转化是对的。但是过个10天左右,就会出现12点多的数据都变成0点的数据,然后13点以后的数据都转化不了。

    系统的区域时间设置看过了,没有问题。

    解决办法:DateTime dt=DateTime.ParseExact('2014-03-02 12:34:45', "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture);

    个人认为产生的原因是:DateTime.Parse的bug 或者是iis下线程的时间区域会变动?

    因为目前没有合适的demo或方式来确认自己的猜想。请那位高手帮忙确认一下原因所在。

    2014年4月15日 8:11

全部回复

  • 12点多的数据都变成0点的数据,然后13点以后的数据都转化不了。

    你好:

    欢迎来到MSDN中文论坛。

    你有没有记录下转换失败的日期字符串呢,能贴出来看看吗?首先应该考虑下给DateTime.Parse()方法传递的日期字符串的格式是否有问题。转换不了的话错误信息是什么也贴出来看看。

    使用DateTime.Parse方法是有潜在风险的,确实会出现一些不可预期的错误,而且这个方法必须添加异常捕获,防止传递的字符串参数的格式不正确,只适用于对时间精确度要求不高的场景,建议使用TryParse方法代替。对于ParseExact方法也建议使用TryParseExact代替。具体Parse方法你可以反编译一下看看是怎么实现的。



    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月16日 3:11
    版主
  • 时间串格式:yyyy-MM-dd HH:mm:ss 这些串的内容肯定不会有25小时,60秒等异常信息的

    C#日志代码:Common.ErrorLog"oldSj:" + DateTime.ParseExact(sj, "yyyy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.InvariantCulture).ToString() + "sj:" + DateTime.Parse(sj).ToString(), "----" + sj);

    日志结果:

    12点以前:10:19:11.1718
    oldSj:2014-4-6 10:18:31sj:2014-4-6 10:18:31:----2014-04-06 10:18:31

    12点以后:12:53:58.6562
    oldSj:2014-4-6 12:53:14sj:2014-4-6 0:53:14:----2014-04-06 12:53:14

    13点以后:调用DateTime.Parse就抛出异常了

    从日志上看12点以后时间就差12小时了,而且这个情况不是每天都有,而是10天左右出现一次

    现在我用DateTime.ParseExact 是能解决问题了。我想知道的是,为什么会有这种异常是否是iis 进程获取的区域性设置异常导致的?
    • 已编辑 alan_msdn 2014年4月16日 3:36 补充
    2014年4月16日 3:32
  • 能否再来帮忙解答一下??我想要知道的是为什么运行好好的,突然转化异常.好像是获取的进程区域性有变化或异常了.
    2014年4月17日 7:23
  • DateTime.Parse是使用Thread.CurrentThread.CurrentCulture来作为时间日期格式的,当Thread.CurrentThread.CurrentCulture的时间日期格式为12小时制(AM、PM)而不是24小时制,你传入13点后的时间就会和格式不符,然后就产生异常。

    12小时制的话12点以后的时间既是0点的时间,也就是说12:53:14和0:53:14是一样的。

    使用DateTime.ParseExact的话,你传入了System.Globalization.CultureInfo.InvariantCulture,在这个CultureInfo下,时间格式是24小时制的。


    • 已编辑 lapheal 2014年4月17日 8:12
    2014年4月17日 8:12
  • 非常感谢你的回答,这个我知道.

    我目前想知道的是为什么iis的webservice运行得好好的,怎么当前进程的区域性就改变了.不是一直有这个问题,而是偶尔才出现的.

    就是为什么有时是12小时制,有时是24小时制?
    2014年4月17日 8:47
  • 没人来帮忙看看吗?这个问题没解决了

    2014年4月22日 8:25
  • 你确定抛出异常的是DateTime.Parse方法吗?具体的异常信息还有堆栈跟踪能贴出来看看吗?


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月22日 9:47
    版主
  • 非常确定是这个方法引起的,上面有我的日志,至于堆栈跟踪给不了,因为这情况很少出现。调试的时候没出现过。
    我想我在这个帖子的第三楼描述的应该够清楚了吧?
    2014年4月22日 11:23
  • 非常感谢你的回答,这个我知道.

    我目前想知道的是为什么iis的webservice运行得好好的,怎么当前进程的区域性就改变了.不是一直有这个问题,而是偶尔才出现的.

    就是为什么有时是12小时制,有时是24小时制?

    就像我之前说的,DateTime.Parse其实就相当于是DateTime.ParseExact(..., ..., Thread.CurrentThread.CurrentCulture)。你可以看一下DateTime.Parse的源码就知道了。

    Thread.CurrentThread.CurrentCulture在不同的线程(是线程不是进程)里面不一定是一样的,所以不能保证一直都是12小时制或者24小时制。IIS的webservice中的线程千千万万,无法保证说每个线程里面的CurrentCulture都是你想要的。

    解决的方法就像你说的直接使用DateTime.ParseExact(..., ..., CultureInfo.InvariantCulture)就行了。

    如果真的非用DateTime.Parse不可,那在使用之前先设置一下Thread.CurrentThread.CurrentCulture即可:

    Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
    DateTime.Parse(...);

    2014年4月22日 12:07
  • 非常确定是这个方法引起的,上面有我的日志,至于堆栈跟踪给不了,因为这情况很少出现。调试的时候没出现过。
    我想我在这个帖子的第三楼描述的应该够清楚了吧?

    我觉得你应该在日志里面记录抛出的异常信息和堆栈跟踪,你的日志只是记录了问题的现象,但更具体的原因只能去猜测。我建议你按照lapheal的方法仔细看一下DateTime的源码,看Parse方法是如何实现的。

    另外更推荐你使用TryParseExact方法。


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    2014年4月23日 1:37
    版主
  • 非常感谢你的专注的回复!

    按照你的意思就是iis的不同线程中Thread.CurrentThread.CurrentCulture是可能不一样的?那这个是什么原因导致不能一直都是12或24小时?是否可以当作iis或.net 的一个bug?

    2014年4月24日 1:26
  • 您好,
    如果web.config中設定globalization的culture屬性為auto,就會依Browser的語系來決定 CurrentCulture

    亂馬客blog: http://www.dotblogs.com.tw/rainmaker/

    2014年4月24日 3:15
  • 谢谢乱马客

    web.config没有这个配置,唯一和culture 有关的是
    <add name="ScriptResource" verb="GET,HEAD" path="ScriptResource.axd" preCondition="integratedMode" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>

    我想这个应该不会导致不同线程的区域性设置不一样吧

    2014年4月24日 5:13
  • 有哪位高手来帮忙彻底解释这问题吗?

    2014年5月4日 3:35
  • 你的日期字符串是24小时制,那么就找个24小时的IFormatProvider。用户的当前区域设置可能和你期望的并不相同。


    Visual C++ MVP

    2014年5月5日 3:45
    版主
  • 你说得没错,但是用户的当前区域设置没人操作的话,是会变化的吗?

    2014年5月7日 6:48