如何检查 .NET 中的特定时区是否存在一个小时

How to check if an hour exists in a specific Time Zone in .NET

在夏令时转换期间,时钟向前移动,因此特定时区的特定日期将不存在特定时间。

.NET 中是否有一种简单的方法来确定某个时区是否存在一个小时?

我找到的唯一方法是尝试将一小时转换为 UTC,并检查异常:

public bool IsValidTime(DateTime date, TimeZoneInfo tzi)
    {
        try
        {
            date = DateTime.SpecifyKind(date, DateTimeKind.Unspecified);
            TimeZoneInfo.ConvertTimeToUtc(date, tzi);
            return true;
        }
        catch
        {
            return false;
        }
    }

所以 运行 这样的事情会 return 错误:

  var date = new DateTime(2020, 3, 8);
  var tzi = TimeZoneInfo.FindSystemTimeZoneById("Cuba Standard Time");

  var isValid = IsValidTime(date, tzi);

是否有任何内置的方法可以做到这一点?

您可以使用 TimeZoneInfoIsInvalidTime 方法。

来自微软:https://docs.microsoft.com/en-us/dotnet/api/system.timezoneinfo.isinvalidtime?view=netframework-4.6.2

示例:在太平洋时区,夏令时从 2:00 A.M 开始。 2006 年 4 月 2 日。以下代码从 1:59 A.M 开始以一分钟为间隔传递时间。 2006 年 4 月 2 日,到 3:01 A.M。 2006 年 4 月 2 日,到表示太平洋时区的 TimeZoneInfo 对象的 IsInvalidTime 方法。控制台输出表明从 2:00 A.M 开始的所有时间。 2006 年 4 月 2 日,到 2:59 A.M。 2006 年 4 月 2 日无效。

// Specify DateTimeKind in Date constructor
DateTime baseTime = new DateTime(2007, 3, 11, 1, 59, 0, DateTimeKind.Unspecified);
DateTime newTime;

// Get Pacific Standard Time zone
TimeZoneInfo pstZone = TimeZoneInfo.FindSystemTimeZoneById("Pacific Standard Time");

// List possible invalid times for a 63-minute interval, from 1:59 AM to 3:01 AM
for (int ctr = 0; ctr < 63; ctr++)
{
   // Because of assignment, newTime.Kind is also DateTimeKind.Unspecified
   newTime = baseTime.AddMinutes(ctr);
   Console.WriteLine("{0} is invalid: {1}", newTime, pstZone.IsInvalidTime(newTime));
}