如何检查.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】:你可以使用TimeZoneInfo
的IsInvalidTime
方法。
来自微软: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中特定时区是不是存在一个小时的主要内容,如果未能解决你的问题,请参考以下文章