当我开始研究时区时,我觉得困难是一件容易的事,但我越是深入研究这个话题,就越是迷失方向。
在Stack Overflow中,已经有几十个类似的问题,主要是试图解决特定的问题,但是没有一个(包括答案)帮助我理解我想要的主题。
除此之外,正如其他人所问,时不时地它看起来像是一些时区的变化,微软不得不通过Windows更新发布的更新来应对它。
在我的例子中,我注意到至少有2个TZ是不正确的:
因为正如我上面提到的,TZ是从本地系统获取的,我试图搜索更新,但没有。所以要么我真的错过了一些重要的东西,要么微软不在乎这两个时区。
有关DST/TZ更新的信息
为了
Daylight Saving Time
,微软有明确的政策和规定:
微软努力将这些更改合并到Windows中,并通过windowsupdate(WU)发布更新。通过WU发布的每个DST/TZ更新都将有最新的时间数据,并将取代之前发布的任何DST/TZ更新
最近的更新可以在专用的
Microsoft Tech Community site
为了帮助自己理解,我创建了一个简单的控制台应用程序(见下面的代码),问题是这还不够。
示例中使用的最重要的类和方法的概述
private static ConsoleColor DefaultColor;
static void Main(string[] args)
{
DefaultColor = Console.ForegroundColor;
foreach (var timeZoneInfo in TimeZoneInfo.GetSystemTimeZones().OrderBy(tz => tz.Id))
{
var firstQuart = new DateTime(2019, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var secondQuart = new DateTime(2019, 4, 1, 0, 0, 0, DateTimeKind.Utc);
var thirdQuart = new DateTime(2019, 7, 1, 0, 0, 0, DateTimeKind.Utc);
var lastQuart = new DateTime(2019, 10, 1, 0, 0, 0, DateTimeKind.Utc);
if (timeZoneInfo.Id == "Altai Standard Time" ||
timeZoneInfo.Id == "Argentina Standard Time" ||
timeZoneInfo.Id == "GMT Standard Time"
)
{
Log($"{timeZoneInfo.DisplayName} (ID: {timeZoneInfo.Id})", ConsoleColor.Yellow);
Log($"StandardName: {timeZoneInfo.StandardName}");
Log($"DST: {timeZoneInfo.SupportsDaylightSavingTime}");
Log($"Daylight Name: {timeZoneInfo.DaylightName}");
Log();
Log($"UTC Offset: {timeZoneInfo.BaseUtcOffset}");
Log($"Dates for each quarter in this year");
var convertedFirstQuart = TimeZoneInfo.ConvertTimeFromUtc(firstQuart, timeZoneInfo);
var convertedSecondQuart = TimeZoneInfo.ConvertTimeFromUtc(secondQuart, timeZoneInfo);
var convertedThirdQuart = TimeZoneInfo.ConvertTimeFromUtc(thirdQuart, timeZoneInfo);
var convertedLastQuart = TimeZoneInfo.ConvertTimeFromUtc(lastQuart, timeZoneInfo);
Log();
Log($"First quarter: {TimeZoneInfo.ConvertTimeFromUtc(firstQuart, timeZoneInfo)}", ConsoleColor.Green);
Log($"DST (DateTime.IsDaylightSavingTime): {convertedFirstQuart.IsDaylightSavingTime()}");
Log($"DST (TimeInfo.IsDaylightSavingTime(DateTime): {timeZoneInfo.IsDaylightSavingTime(convertedFirstQuart)}");
Log($"Ambiguous/Invalid: {timeZoneInfo.IsAmbiguousTime(convertedFirstQuart)}/{timeZoneInfo.IsInvalidTime(convertedFirstQuart)}");
Log();
Log($"Second quarter: {TimeZoneInfo.ConvertTimeFromUtc(secondQuart, timeZoneInfo)}", ConsoleColor.Green);
Log($"DST (DateTime.IsDaylightSavingTime): {convertedSecondQuart.IsDaylightSavingTime()}");
Log($"DST (TimeInfo.IsDaylightSavingTime(DateTime): {timeZoneInfo.IsDaylightSavingTime(convertedSecondQuart)}");
Log($"Ambiguous/Invalid: {timeZoneInfo.IsAmbiguousTime(convertedSecondQuart)}/{timeZoneInfo.IsInvalidTime(convertedSecondQuart)}");
Log();
Log($"Third quarter: {TimeZoneInfo.ConvertTimeFromUtc(thirdQuart, timeZoneInfo)}", ConsoleColor.Green);
Log($"DST (DateTime.IsDaylightSavingTime): {convertedThirdQuart.IsDaylightSavingTime()}");
Log($"DST (TimeInfo.IsDaylightSavingTime(DateTime): {timeZoneInfo.IsDaylightSavingTime(convertedThirdQuart)}");
Log($"Ambiguous/Invalid: {timeZoneInfo.IsAmbiguousTime(convertedThirdQuart)}/{timeZoneInfo.IsInvalidTime(convertedThirdQuart)}");
Log();
Log($"Last quarter: {TimeZoneInfo.ConvertTimeFromUtc(lastQuart, timeZoneInfo)}", ConsoleColor.Green);
Log($"DST (DateTime.IsDaylightSavingTime): {convertedLastQuart.IsDaylightSavingTime()}");
Log($"DST (TimeInfo.IsDaylightSavingTime(DateTime): {timeZoneInfo.IsDaylightSavingTime(convertedLastQuart)}");
Log($"Ambiguous/Invalid: {timeZoneInfo.IsAmbiguousTime(convertedLastQuart)}/{timeZoneInfo.IsInvalidTime(convertedLastQuart)}");
Log("==============================================================");
Log();
}
}
Console.ReadKey();
}
private static void Log(string message = "", ConsoleColor? color = null)
{
if(color.HasValue)
Console.ForegroundColor = color.Value;
Console.WriteLine(message);
Console.ForegroundColor = DefaultColor;
}
}
假设我的本地TZ是GMT,我们使用DST,输出如下:
TimeZoneInfo.SupportsDaylightSavingTime支持()
:
Official Documentation
下面的示例检索
在本地系统上可用,并显示
不支持夏令时。
var zones = TimeZoneInfo.GetSystemTimeZones();
foreach(TimeZoneInfo zone in zones)
{
if (! zone.SupportsDaylightSavingTime)
Console.WriteLine(zone.DisplayName);
}
时区信息.IsDaylightSavingTime(日期时间)
:
Official Documentation
指示指定的日期和时间是否在
当前时区信息时区的夏令时
对象。
DateTime.IsDaylightSavingTime日期时间()
:
Official Documentation
指示此DateTime实例是否在日光范围内
正在保存当前时区的时间范围。
重要的是要明白(一开始我没有),这个方法
是日光节约时间吗
在…的实例上
日期时间
,始终返回请求的信息,并考虑
本地系统时区
.
分析输出
专注于
阿根廷标准时间
,我们可以看到
TimeZoneInfo.SupportsDaylightSavingTime支持
,返回
是的
,这是一个错误的信息,因为我到处搜索它,我发现相反的结果。
即使是对DST的支持也似乎是不正确的,使用C#将UTC DateTime转换为ART TZ总是产生正确的结果。
是什么让我觉得我还是不明白这里的全貌,是不是
TimeInfo.IsDaylightSavingTime时间(日期时间)
返回
假
,这正是我所期望的。
永久夏令时
根据维基百科
https://en.wikipedia.org/wiki/Daylight_saving_time
有时提倡实行“永久性夏令时”(全年在夏季工作,无时间轮班),目前在阿根廷、白俄罗斯、[78]加拿大(如萨斯喀彻温省)、冰岛、吉尔吉斯斯坦、马来西亚、摩洛哥、纳米比亚、新加坡、土耳其、,土库曼斯坦和乌兹别克斯坦。[164]这可能是由于遵循邻近地区的时区、政治意愿或其他原因造成的。
总之,我的开放性问题是:
-
为什么是
TimezoneInfo.SupportsDaylightSavingTime支持()
返回
是的
但是
TimeInfo.IsDaylightSavingTime时间(日期时间)
返回
假
?
-
除了我上面解释的内容外,我如何确保我拥有来自Microsoft的最新DST/TZ更新?