英文:
.Net TimezoneInfo.ConvertTime UTC date to Samoa incorrect value returned
问题
var finalValue = TimeZoneInfo.ConvertTime(x, timeZoneInfo).ToString(format);
当将ConvertTime方法应用于我的'x'日期,该日期位于UTC时区,转换为萨摩亚标准时间时,它错误地增加了+14小时,而不是在timeZoneInfo的BaseUtcOffset中显示的+13小时,我的'finalValue'变量应匹配03:14:39而不是04:14:39,但此方法对其他时区的工作正常。
英文:
var finalValue = TimeZoneInfo.ConvertTime(x, timeZoneInfo).ToString(format);
[](https://i.stack.imgur.com/YgLPc.png)
When applying the ConvertTime method to my 'x' date which is in UTC to the Samoa Standard Time it's incorrectly applying +14 hours instead of the +13 hours that is showing on the BaseUtcOffset in the timeZoneInfo , my 'finalValue' var should match 03:14:39 and not 04:14:39, this method is working correctly for other timezones though
答案1
得分: 3
这似乎确实是一个错误,因为与 2021 年关于萨摩亚夏令时规则的更改相关的 Windows 注册表中缺少数据。
这已经在 IANA 2021b 中实施,但微软似乎忽略了它。在 Microsoft 夏令时博客 上找不到相关信息。
更干净的重现方式:
var dto1 = DateTimeOffset.Parse("2022-01-01T00:00:00Z");
Console.WriteLine(dto1.ToString("o"));
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Samoa Standard Time");
var dto2 = TimeZoneInfo.ConvertTime(dto1, tz);
Console.WriteLine(dto2.ToString("o"));
输出:
2022-01-01T00:00:00.0000000+00:00
2022-01-01T14:00:00.0000000+14:00
(最后一个应该是 2022-01-01T13:00:00.0000000+13:00
。)
相关的 Windows 注册表键是:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Samoa Standard Time\Dynamic DST
,在我的(完全更新的 Win 11 22H2)计算机上显示如下:
2012 年的条目适用于所有年份。应该有一个新的条目用于 2021 年结束夏令时但不重新开始,以及另一个条目用于 2022 年根本没有夏令时。
我会向 Microsoft 报告此问题。谢谢!
英文:
This indeed appears to be a bug, due to missing data in the Windows registry related to the 2021 change to DST rules in Samoa.
https://www.timeanddate.com/news/time/samoa-removes-dst.html
This was implemented in IANA 2021b, but it appears Microsoft missed it. It's not on the Microsoft DST blog.
A cleaner repoduction:
var dto1 = DateTimeOffset.Parse("2022-01-01T00:00:00Z");
Console.WriteLine(dto1.ToString("o"));
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Samoa Standard Time");
var dto2 = TimeZoneInfo.ConvertTime(dto1, tz);
Console.WriteLine(dto2.ToString("o"));
Output:
2022-01-01T00:00:00.0000000+00:00
2022-01-01T14:00:00.0000000+14:00
(The last one should be 2022-01-01T13:00:00.0000000+13:00
.)
The relevant Windows Registry key is:
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\Samoa Standard Time\Dynamic DST
which on my (fully updated Win 11 22H2) machine shows:
The 2012 entry is being applied for all years. There should have been a new entry for 2021 ending DST but not restarting it, and another entry for 2022 that doesn't have DST at all.
I'll report this to Microsoft. Thanks!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论