如何检查 .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);
是否有任何内置的方法可以做到这一点?
您可以使用 TimeZoneInfo
的 IsInvalidTime
方法。
示例:在太平洋时区,夏令时从 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));
}
在夏令时转换期间,时钟向前移动,因此特定时区的特定日期将不存在特定时间。
.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);
是否有任何内置的方法可以做到这一点?
您可以使用 TimeZoneInfo
的 IsInvalidTime
方法。
示例:在太平洋时区,夏令时从 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));
}