C# DateTime分析错误:提供的DateTime表示无效时间
我有一种情况,日期是2016年3月13日凌晨2:41:00。当我按时区转换日期时,我得到一个错误C# DateTime分析错误:提供的DateTime表示无效时间,c#,datetime,timezone,C#,Datetime,Timezone,我有一种情况,日期是2016年3月13日凌晨2:41:00。当我按时区转换日期时,我得到一个错误 DateTime dt = DateTime.Parse("3/13/2016 2:41:00 AM"); DateTime Date_Time = TimeZoneInfo.ConvertTimeBySystemTimeZoneId(dt, "Eastern Standard Time",
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
尝试检查时间是否不明确或有效。您提到的时间,即凌晨2:41:00不存在,因为时钟已提前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(目前作为.NET Framework 3.5的一部分提供)
Beta 1)包含用于检查是否存在DateTime实例的方法
表示特定时区中不明确或无效的时间。这些
方法对于验证中用户提供的点特别有用
时间
背景信息
调整夏令时时间的时区(在大多数情况下)
将时钟时间向后或向前移动1小时)的案例有间隙
并在时间轴上重复-无论时钟时间移动到哪里
通过调整向前或向后。让我们以太平洋标准时间为例
举个例子。2007年太平洋标准时间(PST)更改为太平洋标准时间
第二个星期日凌晨2:00(“春前”)的夏令时(PDT)
3月,然后在第一个星期日凌晨2:00返回(“撤退”)
十一月
要检查时间是否有效,您可以使用:
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");
这正是异常消息所描述的。3月13日是EST从标准时间改为夏令时的日子。没有凌晨2:41:00,当时钟从凌晨2点移动到凌晨3点时,它被跳过。因此,您传递的值只是胡说八道。垃圾进来,垃圾出去,这能回答你的问题吗?这很有趣,直到有人在2021年3月14日凌晨2点在我们的系统中设定了日期,我们才意识到这一点。