Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DateTime分析错误:提供的DateTime表示无效时间_C#_Datetime_Timezone - Fatal编程技术网

C# DateTime分析错误:提供的DateTime表示无效时间

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",

我有一种情况,日期是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", 
                                                                    "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点在我们的系统中设定了日期,我们才意识到这一点。