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

Posted

技术标签:

【中文标题】如何检查.NET中特定时区是不是存在一个小时【英文标题】:How to check if an hour exists in a specific Time Zone in .NET如何检查.NET中特定时区是否存在一个小时 【发布时间】:2020-11-10 21:36:17 【问题描述】:

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

.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;
        
    

所以运行这样的东西会返回 false:

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

  var isValid = IsValidTime(date, tzi);

有没有内置的方法可以做到这一点,不那么混乱?

【问题讨论】:

【参考方案1】:

你可以使用TimeZoneInfoIsInvalidTime方法。

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

示例:在太平洋时区,夏令时从凌晨 2:00 开始。 2006 年 4 月 2 日。以下代码从凌晨 1:59 开始以一分钟的间隔传递时间。 2006 年 4 月 2 日至凌晨 3:01 2006 年 4 月 2 日,用于表示太平洋时区的 TimeZoneInfo 对象的 IsInvalidTime 方法。控制台输出表明从凌晨 2:00 开始的所有时间。 2006 年 4 月 2 日至凌晨 2 点 59 分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));

【讨论】:

以上是关于如何检查.NET中特定时区是不是存在一个小时的主要内容,如果未能解决你的问题,请参考以下文章

ADO.NET DataRow - 检查列是不是存在

如何检查哈希中是不是存在特定值?

Android使用时区检查打开和关闭时间之间是不是已经过去

如何检查 CloudFormation 脚本中是不是已存在特定资源

如何检查哈希中是不是存在特定键?

如何检查文件是不是存在于android设备的特定文件夹中