日期时间解析错误:提供的日期时间表示无效时间。

15

我有一个情况,日期是 "3/13/2016 2:41:00 AM"。当我按时区转换日期时,会出现错误。

DateTime dt = DateTime.Parse("3/13/2016 2:41:00 AM");
DateTime Date_Time = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time", 
                                                                    "GMT Standard Time");
Response.Write(dt);

执行后,我得到了这个错误:

提供的日期时间表示无效时间。例如,当时钟向前调整时,跳过的时间段中的任何时间都是无效的。参数名称:dateTime


6
正如异常信息所描述的那样。3月13日是EST从标准时间转为夏令时的那一天。当时钟瞬间从凌晨2点调整到3点时,没有2:41:00 AM这个时间点,所以你传递的值毫无意义。输入垃圾,输出垃圾。 - Hans Passant
这个回答解决了你的问题吗?在某些DateTime值上调用TimeZoneInfo.ConvertTimeToUtc时出现异常 - Michael Freidgeim
这很有趣,直到有人在我们的系统中设置了2021年3月14日凌晨2点的日期,我们才意识到这一点。 - Scott Wilson
2个回答

17

检查时间是否模糊或为有效时间。由于夏令时的更改,您提到的时间即2:41:00 AM不存在,因为时钟向前移动了1个小时,因此日期无效或模糊。

2016    Sun, 13 Mar, 02:00  CST → CDT   +1 hour (DST start) UTC-5h
        Sun, 6 Nov, 02:00   CDT → CST   -1 hour (DST end)   UTC-6h

您也可以参考这篇博客:System.TimeZoneInfo:处理时间中的模糊和无效点

System.TimeZoneInfo(目前可作为.NET Framework 3.5 Beta 1的一部分使用)包含方法,用于检查DateTime实例是否表示特定时区中的模糊或无效时间。这些方法对于验证用户提供的时间点尤其有用。

背景信息

调整其时间以进行夏令时的时区(在大多数情况下通过将时钟时间向后或向前移动1小时)在时间线上具有间隔和重复 - 无论何时时钟时间因调整而向前或向后移动。让我们以太平洋标准时间为例。在2007年,太平洋标准时间(PST)在三月第二个星期日的02:00AM(“向前跃进”)更改为太平洋夏令时间(PDT),然后在11月的第一个星期日的02:00AM(“回退”)返回标准时间。

要检查时间是否有效,您可以使用:

TimeZoneInfo.IsInvalidTime

1
在我的情况下,我试图转换一个UTC日期(因此,它是有效的,因为UTC日期不会跳过任何DST时间段)。
问题在于我从Entity Framework加载日期时,DateKind被设置为Unspecified。在这种情况下,ConvertTimeBySystemTimeZoneId假定它是本地时间,并可能找到它无效。
解决方法是在转换之前正确设置DateKind为UTC:
var date = DateTime.ParseExact("2019-03-31T03:06:55.7856471", "O", CultureInfo.InvariantCulture);
// Here date.Kind == DateTimeKind.Unspecified

date = DateTime.SpecifyKind(date, DateTimeKind.Utc);
// Now date.Kind == DateTimeKind.Utc

// Now the conversion should work
TimeZoneInfo.ConvertTimeBySystemTimeZoneId(date, "Central Standard Time");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接