提问人:MG7 提问时间:11/8/2023 更新时间:11/9/2023 访问量:71
Windows 10 上“埃及标准时间”的时区偏移不正确
TimeZone Offset is incorrect for "Egypt Standard Time" on Windows 10
问:
我正在尝试将 UTC 日期转换为“埃及标准时间”,但计算出的夏令时偏移量因操作系统版本而异:
- 在 Windows 10 上,偏移量为 +2
- 在 Windows 11 上,偏移量为 +3(这是正确的偏移量)
这是我用于转换的代码:
TimeZoneInfo timeZone = TZConvert.GetTimeZoneInfo("Egypt Standard Time");
DateTimeOffset initialLocalTime = TimeZoneInfo.ConvertTime(dateTimeUtc, timeZone);
dateTimeUtc 的类型为 ,其值为:DateTimeOffset
{10/14/2023 9:00:00 PM +00:00}
Date: {10/14/2023 12:00:00 AM}
DateTime: {10/14/2023 9:00:00 PM}
Day: 14
DayOfWeek: Saturday
DayOfYear: 287
Hour: 21
LocalDateTime: {10/15/2023 12:00:00 AM}
Millisecond: 0
Minute: 0
Month: 10
Offset: {00:00:00}
Second: 0
Ticks: 638329140000000000
TimeOfDay: {21:00:00}
UtcDateTime: {10/14/2023 9:00:00 PM}
UtcTicks: 638329140000000000
Year: 2023
结果如下:
{10/14/2023 11:00:00 PM +02:00}
Date: {10/14/2023 12:00:00 AM}
DateTime: {10/14/2023 11:00:00 PM}
Day: 14
DayOfWeek: Saturday
DayOfYear: 287
Hour: 23
LocalDateTime: {10/15/2023 12:00:00 AM}
Millisecond: 0
Minute: 0
Month: 10
Offset: {02:00:00}
Second: 0
Ticks: 638329212000000000
TimeOfDay: {23:00:00}
UtcDateTime: {10/14/2023 9:00:00 PM}
UtcTicks: 638329140000000000
Year: 2023
在结果中,偏移量为 +2,应为 +3。
我发现埃及的夏令时最近发生了变化,我认为这是在 Windows 10 上无法正常工作的原因。
如何在所有操作系统上正确计算此时区的偏移量? 我是否应该调用一些外部服务以获得正确的偏移量?
答:
正如 Sweeper 和 Fildor 在评论中提到的,该问题与操作系统版本无关,而是因为一台计算机应用了正确的 Windows 更新,而另一台计算机没有。
当政府更改其时区规则(包括标准时间、夏令时以及两者之间的转换)时,Microsoft 会发布对 Windows 的更新以应对更改。理想情况下,所有计算机都会自动接收 Windows 更新。如果没有,那么他们将无法知道政府做出了什么改变。
在 .NET 中使用时,时区数据取自基础操作系统。在 Windows 上,这意味着 .NET 会受到通过 Windows 更新提供的这些时区更新的影响。MacOS和Linux也有类似的情况,但更新源于IANA tz数据库,而不是Microsoft。TimeZoneInfo
因此,要直接回答您的问题 - 将最新的 Windows 更新(或公告博客文章中提到的特定 KB)应用于获得错误时区偏移量的计算机,它将解决问题。
作为替代方法,可以考虑编写应用程序,以便控制时区数据而不是操作系统。在 .NET 中执行此操作的最佳方法是使用 Noda Time 库。请参阅该库文档中的更新时区数据库。如果采用这种方法,则需要定期获取一个新文件并将其应用于应用程序。您可以在构建应用程序的更新版本时执行此操作,或者您的应用程序可以自包含用于获取时区数据的逻辑。无论哪种方式,实施都取决于您。NodaZoneData
上一个:自动时区检测
下一个:如何根据时区获取时差?
评论