Windows 10 上“埃及标准时间”的时区偏移不正确

TimeZone Offset is incorrect for "Egypt Standard Time" on Windows 10

提问人:MG7 提问时间:11/8/2023 更新时间:11/9/2023 访问量:71

问:

我正在尝试将 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 上无法正常工作的原因。

如何在所有操作系统上正确计算此时区的偏移量? 我是否应该调用一些外部服务以获得正确的偏移量?

C# DST 时区偏移量

评论

2赞 Sweeper 11/8/2023
Windows 10 应具有更新的 DST 偏移量。请参阅 techcommunity.microsoft.com/t5/daylight-saving-time-time-zone/...
2赞 Fildor 11/8/2023
^^ 更新的 Windows 10。如果它是在更改之前安装的,然后从未更新过(但是,这极不可能),则更改在该特定安装上不处于活动状态。
1赞 ChrisBD 11/8/2023
这突出了强烈建议内部所有应用程序都使用 UTC 的原因之一
1赞 MG7 11/8/2023
@Sweeper,更新由公司管理,因此我假设此更新未安装在公司的计算机和服务器上。
2赞 Matt Johnson-Pint 11/8/2023
@ChrisBD - (叹息,又一次。“始终使用 UTC”是需要停止的误导性建议。当地时间有很多案例。具体来说,UTC 用于时间戳(即日志、购买时间等)。本地时间用于计划将来的事件,以及涉及业务逻辑的任何计算。例如,“销售将于下周二结束”不能严格按照 UTC 执行,因为本地和 UTC 之间的偏移量可能会从现在到那时发生变化。尤其是在政府改变规则的情况下。另一个例子是从生日开始计算年龄。那里没有UTC。

答:

2赞 Matt Johnson-Pint 11/9/2023 #1

正如 Sweeper 和 Fildor 在评论中提到的,该问题与操作系统版本无关,而是因为一台计算机应用了正确的 Windows 更新,而另一台计算机没有。

当政府更改其时区规则(包括标准时间、夏令时以及两者之间的转换)时,Microsoft 会发布对 Windows 的更新以应对更改。理想情况下,所有计算机都会自动接收 Windows 更新。如果没有,那么他们将无法知道政府做出了什么改变。

在 .NET 中使用时,时区数据取自基础操作系统。在 Windows 上,这意味着 .NET 会受到通过 Windows 更新提供的这些时区更新的影响。MacOS和Linux也有类似的情况,但更新源于IANA tz数据库,而不是Microsoft。TimeZoneInfo

因此,要直接回答您的问题 - 将最新的 Windows 更新(或公告博客文章中提到的特定 KB)应用于获得错误时区偏移量的计算机,它将解决问题。

作为替代方法,可以考虑编写应用程序,以便控制时区数据而不是操作系统。在 .NET 中执行此操作的最佳方法是使用 Noda Time 库。请参阅该库文档中的更新时区数据库。如果采用这种方法,则需要定期获取一个新文件并将其应用于应用程序。您可以在构建应用程序的更新版本时执行此操作,或者您的应用程序可以自包含用于获取时区数据的逻辑。无论哪种方式,实施都取决于您。NodaZoneData