【问题标题】:DateTime parsing error: The supplied DateTime represents an invalid timeDateTime 解析错误:提供的 DateTime 表示无效时间
【发布时间】:2016-07-25 03:28:32
【问题描述】:

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

【问题讨论】:

  • 正如异常消息所述,完全正确。 3 月 13 日是美国东部标准时间从标准时间转变为夏令时的日子。没有凌晨 2:41:00,当时钟从凌晨 2 点瞬间移动到凌晨 3 点时,它被跳过了。所以你传递的值只是一派胡言。垃圾进,垃圾出。
  • 这很有趣,直到有人在我们的系统中设置了 2021 年 3 月 14 日凌晨 2 点的日期时才意识到这一点。

标签: c# datetime timezone


【解决方案1】:

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

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

背景信息

为夏令时调整时间的时区(在大多数情况下) 通过将时钟时间向后或向前移动 1 小时的情况)有间隙 并在时间线中重复——无论时钟时间移动到哪里 通过调整前进或后退。让我们使用太平洋标准时间作为 一个例子。 2007 年太平洋标准时间 (PST) 更改为太平洋 第二个星期日凌晨 02:00(“春天”)的夏令时 (PDT) 3 月,然后在第一个星期日凌晨 2:00(“后退”)返回 十一月

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

TimeZoneInfo.IsInvalidTime

【讨论】:

    【解决方案2】:

    就我而言,我试图转换 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");
    

    【讨论】:

      猜你喜欢
      • 2012-08-08
      • 2020-01-12
      • 2011-09-17
      • 1970-01-01
      • 1970-01-01
      • 2013-07-14
      • 1970-01-01
      • 2012-05-05
      • 2016-07-15
      相关资源
      最近更新 更多