当您使用TimeZoneInfo
Windows 上使用系统时区的类("GMT Standard Time"
在本例中),您需要从 Windows 操作系统获取时区数据,该数据存储在注册表中:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones
Windows 根本无法回溯那么远的历史数据。为了"GMT Standard Time"
,这是伦敦在 GMT 和 BST 之间交替的时区,它只知道一组规则 - 当前有效的规则。它不知道之前的任何事情(最后一次改变是在 1996 年)。
请注意,根据 MicrosoftDST/TZ 支持政策,仅保证记录 2010 年以后的更改。 Windows 历史上有一些较旧的更改(例如美国 2007 年 DST 更改等),这些更改确实有效,但从全球角度来看,您可能无法在 2010 年之前的日期获得最佳结果。
为此,您需要完整实施IANA TZ 数据库,而在 .NET 中,实现此目的的最佳方法之一是使用野田时间图书馆。
您的代码,音译为野田时间:
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");
也可以看看时区标签 wiki.