【问题标题】:How to determine if the values in a DateTime are valid?如何确定 DateTime 中的值是否有效?
【发布时间】:2015-04-14 13:38:39
【问题描述】:

我们有一行代码:

DateTime.Now.AddMinutes(-1);

2015 年 3 月 29 日凌晨 2:00 在英国运行。返回值是 1:59,但是由于转换到夏令时 1:59 实际上并没有发生,并导致进一步的异常。

在我看来,这是 .NET 中的一个错误,但是我们如何在以下行引发异常之前验证这是一个有效的 DateTime 以代替修复框架?

我真的在寻找类似的扩展方法。

if(!theDate.IsValidInTimezone(TimeZoneInfo.Local))
{
  // the time is not valid
}

【问题讨论】:

  • 可以选择使用像 Noda Time 这样的库吗?
  • 你可以去 DateTime->Ticks->DateTime 并检查此往返是否在同一时间点到达。
  • DateTime.NowUtc.AddMinute(-1).ToLocal(TimeZoneInfo.Local) 怎么样

标签: c# .net validation datetime


【解决方案1】:

TimeZoneInfo.IsInvalidTime 方法可以在这里为您提供帮助。

【讨论】:

    【解决方案2】:

    这本身不是错误。 DateTime 不关心实际的偏移量,如果你在做任何时间算术,你应该使用 UTC。

    例子:

        DateTime dt = new DateTime(2015, 3, 29, 2, 59, 0, DateTimeKind.Local);
        DateTime dt2 = dt.ToUniversalTime();
        Console.WriteLine(dt.ToString());
        Console.WriteLine(dt.AddMinutes(1).ToString());
        Console.WriteLine(dt2.AddMinutes(1).ToLocalTime().ToString());
    

    这将显示差异:

    29.3.2015 2:59:00
    29.3.2015 3:00:00
    29.3.2015 4:00:00
    

    所以始终以 UTC 处理日期。

    或者你可以使用DateTimeOffset,它会记住实际的偏移量。您可以转换为当地时间:

        DateTimeOffset dt = new DateTime(2015, 3, 29, 2, 59, 0, DateTimeKind.Local);
        Console.WriteLine(dt.ToString());
        Console.WriteLine(dt.AddMinutes(1).ToString());
        Console.WriteLine(dt.AddMinutes(1).ToLocalTime().ToString());
    

    结果:

    29.3.2015 2:59:00 +02:00
    29.3.2015 3:00:00 +02:00
    29.3.2015 4:00:00 +03:00
    

    【讨论】:

      猜你喜欢
      • 2012-06-08
      • 2016-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多