我有一种情况,日期是"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
尝试检查时间是否模糊或有效时间。 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
在我的情况下,我试图转换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");