C# TimeZoneInfo.GetUtcoffset的可靠性如何?
我正在使用C# TimeZoneInfo.GetUtcoffset的可靠性如何?,c#,timezone,dst,C#,Timezone,Dst,我正在使用TimeZoneInfo对象中的函数GetUtcoffset()获取特定日期时间的Utc偏移值。一般来说,夏令时将遵循特定规则,例如“从10月的第一个星期日开始,到4月的第一个星期日结束”(澳大利亚东部标准时间),因此我相信该函数产生的结果 但我确实想知道,如果政府的决定推迟或改变夏令时,结果会怎样?在过去,有几次(澳大利亚)政府违反了某些活动的夏令时规定。在这些情况下,调用GetUtcoffset()是否会产生错误的结果,或者库是否足够聪明,可以“偶尔”从internet上的某个源获
TimeZoneInfo
对象中的函数GetUtcoffset()
获取特定日期时间的Utc偏移值。一般来说,夏令时将遵循特定规则,例如“从10月的第一个星期日开始,到4月的第一个星期日结束”(澳大利亚东部标准时间),因此我相信该函数产生的结果
但我确实想知道,如果政府的决定推迟或改变夏令时,结果会怎样?在过去,有几次(澳大利亚)政府违反了某些活动的夏令时规定。在这些情况下,调用GetUtcoffset()
是否会产生错误的结果,或者库是否足够聪明,可以“偶尔”从internet上的某个源获取夏时制更新
用法:
我正在开发一个停车管理系统。一个数据库跨时区不同的多个客户端共享。停车事件的时间可以作为法庭上的证据,因此,正确把握时间是极其重要的。当系统收到车辆已停车的通知时,系统将生成到达时间。考虑到通知可能来自不同时区的远程站点,我想知道是否可以可靠地使用时区在客户端站点计算当前日期时间
例如:
string clientTimeZoneId = "AUS Eastern Standard Time";
var utcTime = DateTime.UtcNow;
var clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(clientTimeZoneId);
var arrivalTime = utcTime.Add(clientTimeZone.GetUtcOffset(utcTime));
这就是GetUtcOffset
函数变得重要的地方。考虑到2019-2020年,“澳大利亚东部标准时间”夏令时将于2020年4月5日结束,6日致电GetUtcOffset将给出+10:00:00。但是,如果出于任何原因(例如奥运会项目),DST延长至第10名,则根据GetUtcOffset
的值,到达时间可能不正确一小时
目前,我们的系统管理员必须每年手动更新数据库中的夏时制日期,但不必这样做就好了。我不知道政府在这些事件中到底做了什么,但他们一定把更新发送到了某个地方,否则受影响时区的所有计算机都会有错误的时间。因此,回到我最初的问题,TimeZoneInfo是否会从任何“DST源”获取数据?您的问题有两个部分。我将从您首先给出的代码示例开始:
var arrivalTime = utcTime.Add(clientTimeZone.GetUtcOffset(utcTime));
这是不正确地应用偏移。由于utcTime
将其Kind
属性设置为DateTimeKind.Utc
,因此调用Add
后的结果值也是如此。因此,您没有调整偏移量,而是实际选择了不同的时间点(未来10或11小时)
有几种不同的方法可以替代:
- 您可以在
上使用TimeZoneInfo
或ConvertTime
方法。结果日期和时间将与以前相同,但ConvertTimeFromUtc
将正确设置为种类
DateTimeKind.Unspecified
DateTime utcNow = DateTime.UtcNow; DateTime arrivalTime = TimeZoneInfo.ConvertTime(utcNow, clientTimeZone);
- 您可以使用检索到的偏移量构建
:DateTimeOffset
DateTimeOffset utcTime = DateTimeOffset.UtcNow; DateTimeOffset arrivalTime = utcTime.ToOffset(clientTimeZone.GetUtcOffset(utcTime));
- 您可以使用
更轻松地创建TimeZoneInfo.ConvertTime
。这与前面的代码做的事情相同,但是更干净DateTimeOffset
DateTimeOffset utcTime = DateTimeOffset.UtcNow; DateTimeOffset arrivalTime = TimeZoneInfo.ConvertTime(utcTime, clientTimeZone);
DateTimeOffset
。您将获得本地时间和UTC的偏移量。把所有的东西都储存起来。(如果您在数据库中使用类似Microsoft SQL Server的内容,只需使用一个datetimeoffset
字段即可。)
同时拥有本地时间和偏移量的好处是,即使某些内容发生了变化,您也有足够的数据来恢复世界时的实际点,并且您仍然拥有可以由本地时间合理化的格式的数据。(或者,您可以将UTC时间和本地时间存储在两个单独的字段中。有时这有助于编制索引。)
至于你关于数据可靠性的第二个问题,我建议阅读,并回答我的问题。一般来说,是的。数据是可靠的。但是,让我们把你所描述的关于政府偏差的情景拆开
- 首先,您是否知道已经发生的任何未记录在时区数据中的偏差?看看,或者。如果存在未记录的偏差,则可能应该记录。请将此类信息发送至。其他人都从那里得到了变化
- 对于Windows,您可以在
上检查注册表数据。请参阅Josh Free的Microsoft博客文章,了解它们是如何工作的。对于悉尼来说,上次记录的规则变更是在2008年,这与IANA和时间和日期信息一致HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\AUS Eastern Standard Time\Dynamic DST
- 请记住,Windows假定2007年悉尼奥运会的规则在这之前的所有时间点都是相同的。它没有IANA数据库的历史深度。例如,Windows不知道IANA数据库评论中提到的2000年奥运会的偏差。如果此类历史更改对应用程序很重要,则需要在中使用TZDB提供程序。(尽管我无法想象,为什么你会在今天的停车场应用程序中需要这些历史记录。)
- 如果他们给出了足够的通知,那么IANA和Windows都会接受更改并通过Windows Update进行分发。您的Windows计算机将自动接收更改,并且您的应用程序将正确地接受偏差
- 如果他们没有提供足够的通知,那么M