C# GetUtcofset返回某些年份/日期的错误偏移 var currentServerOffset=TimeZone.CurrentTimeZone.GetUtcOffset(新的日期时间(1972,03,19,02,00,00);

C# GetUtcofset返回某些年份/日期的错误偏移 var currentServerOffset=TimeZone.CurrentTimeZone.GetUtcOffset(新的日期时间(1972,03,19,02,00,00);,c#,datetime,timezone-offset,defaultmodelbinder,C#,Datetime,Timezone Offset,Defaultmodelbinder,使用上面的返回错误的偏移量,但是当您通过3月26日时,它会被更正 这似乎是关闭了整整一周,在我的测试中,这是在1972年和1973年参考: 我认为这可能与这些年GetDaylightChanges的错误有关。参考: 当我在1972年或1973年称之为传球时,起跑时间缩短了7天 我该如何解决这个问题?我们无法让GetUtcOffset处理历史日期。相反,我们使用了Noda时间,这应该很容易: var dt = Instant.FromUtc(1972, 03, 19, 02, 00, 00); D

使用上面的返回错误的偏移量,但是当您通过3月26日时,它会被更正

这似乎是关闭了整整一周,在我的测试中,这是在1972年和1973年参考:

我认为这可能与这些年GetDaylightChanges的错误有关。参考:

当我在1972年或1973年称之为传球时,起跑时间缩短了7天


我该如何解决这个问题?

我们无法让GetUtcOffset处理历史日期。相反,我们使用了Noda时间,这应该很容易:

var dt = Instant.FromUtc(1972, 03, 19, 02, 00, 00);
DateTimeZone zone = DateTimeZoneProviders.Tzdb["Europe/London"];
Offset offset = zone.GetUtcOffset(dt);

TimeZoneInfo.findsystemtimezonebyd(TimeZoneInfo.Local.Id).GetAdjustmentRules()
给了你什么?通常,Windows TZ数据库没有历史数据,只有足够的数据来覆盖实际的“当前”时间(Windows在1972年不存在)。在我的(W10)系统上,“格林威治标准时区”(这大概就是你正在使用的)没有动态调整规则,只是涵盖了与欧盟其他国家保持一致以来的一段时间。据报道确实有历史数据(免责声明:未经个人测试)。正确。Windows没有所有区域的历史数据。它只保证从2010年起的完整性,尽管有一些区域有较旧的数据。此外,
TimeZone
类永远不会提供历史信息,即使是有历史信息的区域。
类始终假定当前的一组转换规则。因此在上,
TimeZoneInfo
应被视为不推荐使用。请改为使用
TimeZoneInfo
,或者如果需要历史数据,请使用Noda Time,如howsec的回答所示。请注意,Linux或OSX上的
TimeZoneInfo
(通过.NET Core)确实有历史信息。感谢您的回复,很遗憾我无法使用.net framework解决我的问题,但是我安装了NodeTime,它为测试用例返回正确的偏移量。回答得好。但是,如果像问题一样,需要当前时区,则
DateTimeZoneProviders.Tzdb.GetSystemDefault()
可以使用。