Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# TimeZoneInfo.GetUtcoffset的可靠性如何?_C#_Timezone_Dst - Fatal编程技术网

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,您可以在
    HKEY\U LOCAL\U MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Time Zones\AUS Eastern Standard Time\Dynamic DST
    上检查注册表数据。请参阅Josh Free的Microsoft博客文章,了解它们是如何工作的。对于悉尼来说,上次记录的规则变更是在2008年,这与IANA和时间和日期信息一致

  • 请记住,Windows假定2007年悉尼奥运会的规则在这之前的所有时间点都是相同的。它没有IANA数据库的历史深度。例如,Windows不知道IANA数据库评论中提到的2000年奥运会的偏差。如果此类历史更改对应用程序很重要,则需要在中使用TZDB提供程序。(尽管我无法想象,为什么你会在今天的停车场应用程序中需要这些历史记录。)

那么,如果澳大利亚政府决定在未来做出偏差,会发生什么

  • 如果他们给出了足够的通知,那么IANA和Windows都会接受更改并通过Windows Update进行分发。您的Windows计算机将自动接收更改,并且您的应用程序将正确地接受偏差

  • 如果他们没有提供足够的通知,那么M