我正在try 将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.

我发现最近Daylight saving time in Egypt被更改了,我想这就是Windows 10不能正常工作的原因.

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

推荐答案

作为Sweeper and Fildor mentioned in comments,问题与操作系统版本无关,而是因为一台机器应用了the correct Windows Update,而另一台机器没有.

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

在.NET中使用TimeZoneInfo时,将从底层操作系统获取时区数据.在Windows上,这意味着.NET会受到通过Windows更新提供的这些时区更新的影响.MacOS和Linux也出现了类似的情况,但更新来自the IANA tz database,而不是微软.

因此,直接回答您的问题-将最新的Windows更新(或the announcement blog post中提到的特定知识文库)应用到获得错误时区偏移量的计算机,它将解决问题.

作为替代方法,您可以考虑编写应用程序,使you控制时区数据,而不是操作系统.在.NET中,要做到这一点,最好的方法是使用Noda Time library.请参见该库文档中的Updating the time zone database.如果采用这种方法,则需要定期获取新的NodaZoneData文件并将其应用于应用程序.您可以在构建应用程序的更新版本时这样做,或者您的应用程序可以自包含获取时区数据的逻辑.无论哪种方式,实现都取决于您.

Csharp相关问答推荐

在WPF.NET 6中使用C++/WinRT组件(但实际上是任何WinRT组件)

解析需要HttpClient和字符串的服务

将列表字符串映射为逗号分隔字符串<>

是否可以使用EF—Core进行临时部分更新?

C#DateTime.ToString在ubuntu和centos中返回不同的结果

HttpConext.Request.Path和HttpConext.GetEndpoint()之间的差异

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

try 在.Net核心身份注册页面中使用AJAX,但没有成功..NET Core 5.0 Razor页面应用程序

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

如何管理Azure认证客户端响应和证书 fingerprint

BFF到具有AAD/Entra ID B2C的内部API(.NET/ASP.NET核心/标识.Web)

将操作从编辑页重定向到带参数的索引页

Blazor Server.NET 8中的Blazore.FluentValidation问题

获取混淆&Quot;模糊引用&Quot;错误

如何在发布NuGet包之前设置命名空间?

用于获取字符串的最后12个字符的正则表达式(空格除外)

FakeItEasy自动嘲弄内容

Xamarin Forms应用程序中登录页面的用户名和密码编辑文本之间不需要的空格

同时通过多个IEumable<;T&>枚举

在SQL中删除少于24小时的令牌