【问题标题】:How to check if an hour exists in a specific Time Zone in .NET如何检查.NET中特定时区是否存在一个小时
【发布时间】:2023-03-11 23:08:01
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# timezone dst


    【解决方案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));
    }
    

    【讨论】:

      猜你喜欢
      • 2021-04-03
      • 1970-01-01
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多