DateTime解析错误:提供的DateTime表示无效时间

问题描述 投票:9回答:2

我有一种情况,日期是"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表示无效时间。例如,当向前调整时钟时,跳过的时间段中的任何时间都是无效的。参数名称:dateTime

c# datetime timezone
2个回答
11
投票

尝试检查时间是否模糊或有效时间。 Due to the daylight change你提到的时间,即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: Working with Ambiguous and Invalid Points in Time

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

背景资料

调整夏令时间的时区(在大多数情况下通过将时钟时间向后或向前移动1小时)在时间线中有间隙和重复 - 时钟时间通过调整向前或向后移动。我们以太平洋标准时间为例。 2007年太平洋标准时间(太平洋标准时间)在3月的第二个星期日上午02:00(“春季前进”)更改为太平洋夏令时(PDT),然后在第一个星期日的02:00 AM(“后退”)返回十一月

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

TimeZoneInfo.IsInvalidTime

0
投票

在我的情况下,我试图转换UTC日期(因此,它是有效的,因为UTC日期不会跳过DST的任何时间段)。

问题是我从实体框架加载日期,而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");
© www.soinside.com 2019 - 2024. All rights reserved.