gpt4 book ai didi

.net - TimeZoneInfo - 相同的 TimeZoneInfo id,不同的夏令时支持值

转载 作者:行者123 更新时间:2023-12-05 06:55:52 24 4
gpt4 key购买 nike

我们的服务器无法正确处理从 UTC 转换为本地时间的 C# DateTime 实例的夏令时。我们在英国,因此我们的服务器设置为“(UTC+00:00) 都柏林、爱丁堡、里斯本、伦敦”区域。

症状:

DateTime utcTime = new DateTime(2020, 10, 15, 23, 53, 20, DateTimeKind.Utc);
DateTime localTime = utcTime.ToLocalTime();
Console.WriteLine($"UTC time: {utcTime:s}");
Console.WriteLine($"Local time: {localTime:s}");

UTC time: 2020-10-15T23:53:20
Local time: 2020-10-15T23:53:20 // should be 2020-10-16T00:53:20

调查:

var gmt = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time");
Console.WriteLine("GMT:");
Console.WriteLine($"ID: {gmt.Id}");
Console.WriteLine($"DisplayName: {gmt.DisplayName}");
Console.WriteLine($"DST: {gmt.SupportsDaylightSavingTime}");
var local = TimeZoneInfo.Local;
Console.WriteLine("Local:");
Console.WriteLine($"ID: {local.Id}");
Console.WriteLine($"DisplayName: {local.DisplayName}");
Console.WriteLine($"DST: {local.SupportsDaylightSavingTime}");

在“普通”工作站和服务器上,输出是:

GMT:
ID: GMT Standard Time
DisplayName: (UTC+00:00) Dublin, Edinburgh, Lisbon, London
DST: True

Local:
ID: GMT Standard Time
DisplayName: (UTC+00:00) Dublin, Edinburgh, Lisbon, London
DST: True

在流氓服务器上,它是:

GMT:
ID: GMT Standard Time
DisplayName: (UTC+00:00) Dublin, Edinburgh, Lisbon, London
DST: True

Local:
ID: GMT Standard Time
DisplayName: GMT Standard Time
DST: False

这个具有相同 ID 但不同名称和 DST 支持的“GMT 标准时间”时区信息实例的来源是什么?

“流氓”服务器是 Windows Server 2012 R2。我在注册表项中没有看到任何明显不合适的地方

例如HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\下有一个“GMT 标准时间”键,声明名称“(UTC+00:00) Dublin, Edinburgh, Lisbon, London”

在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation\下,TimeZoneKeyName 的值为“GMT 标准时间”

编辑:我们正在运行 .NET 框架代码。UTC 到本地的转换失败出现在 .NET v2 和 .NET v4.7.2 中。

最佳答案

您的答案就在您的输出中。你说 rouge 服务器没有正确支持 DST 然后当你检查你看到的时区时:

DST: False

其他服务器显示 True 的地方。

您有两个选择:

  1. 检查代码中的夏令时设置,当不符合预期时添加偏移量
  2. 在所有服务器上启用相同的夏令时

我会选择 #2,因为这将适用于所有应用程序,而不仅仅是您的应用程序。服务器将在一年中的部分时间关闭一个小时。所以有时这不是问题,有时又是。通常,您只需在时钟设置中勾选启用夏令时。您引用了注册表值,所以这是 DST 的值:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation

Value Name: DynamicDaylightTimeDisabled
Value Type: REG_DWORD
Value: 0

设置 DynamicDaylightTimeDisabled = 0 应该使它在这台机器上成为 DST = True,然后它应该像其他机器一样运行。

关于.net - TimeZoneInfo - 相同的 TimeZoneInfo id,不同的夏令时支持值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65254418/

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