gpt4 book ai didi

c# - 为什么 C# 检测不到 1970/1/1 在 BST 下?

转载 作者:太空宇宙 更新时间:2023-11-03 21:06:33 25 4
gpt4 key购买 nike

我正在使用第 3 方 API,该 API 返回时间值作为 DateTime 值,在 1970 年 1 月 1 日作为日期部分填充。因此对于凌晨 5 点,它将返回类似 1969-12-31T21:03:00.000-08:00

的内容

问题是,如果用户在伦敦时间,C# 无法为 1970-01-01 应用 BST 调整。例如,UTC 中的 1970-01-01 5AM 在伦敦应为 1970-01-01 6AMSee conversion

但是,C# 似乎没有应用这种转换:

var utcTime = new DateTime(1970, 1, 1, 5, 0, 0, DateTimeKind.Utc);
var britishZone = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
var ukTime = TimeZoneInfo.ConvertTime(utcTime, britishZone);
Console.WriteLine(ukTime);

上面的代码仍然会打印 5AM。

但是,如果我将其设置为英国夏令时生效的较新日期,例如 2016 年 10 月 1 日,则相同的代码可以正确打印早上 6 点。

  1. 为什么会这样?
  2. 我该如何解决这个问题?我们的应用程序需要跨任何时区工作(即硬编码时区不是一个选项 - 我们基本上使用 Windows 本地时区)。

最佳答案

当您在 Windows 上使用 TimeZoneInfo 类来处理系统时区(在本例中为 “GMT Standard Time”)时,您需要的是时区数据来自 Windows 操作系统,存储在注册表中:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones

Windows 根本不会将历史数据带回那么远。对于 “GMT 标准时间”,这是在 GMT 和 BST 之间交替的伦敦时区,它只知道一组规则 - 当前有效的规则。在此之前它不知道任何事情(它最后一次更改是在 1996 年)。

请注意,根据 Microsoft 的 DST/TZ Support Policy , 只保证记录 2010 年以后的变化。 Windows 中历来有几项较旧的更改(例如美国 2007 年 DST 更改等),它们确实有效,但从全局角度来看,您可能无法在 2010 年之前获得最佳结果。

为此,您需要完整实现 the IANA TZ Database , 而在 .NET 中,最好的方法之一是使用 Noda Time图书馆。

您的代码,音译为 Noda Time:

var utcTime = Instant.FromUtc(1970, 1, 1, 5, 0, 0);
var britishZone = DateTimeZoneProviders.Tzdb["Europe/London"];
var ukTime = utcTime.InZone(britishZone);
Console.WriteLine(ukTime.ToDateTimeUnspecified()); // just for equivalent output

// Prints: 1/1/1970 6:00:00 AM

另请注意,如果您在 Linux 或 OSX 上运行 .NET Core,则时区确实是 IANA 时区,因此您的原始代码只需使用 IANA 标识符即可工作

var britishZone = TimeZoneInfo.FindSystemTimeZoneById("Europe/London");

另见 the timezone tag wiki .

关于c# - 为什么 C# 检测不到 1970/1/1 在 BST 下?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40836605/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com