为了账号安全,请及时绑定邮箱和手机立即绑定

在C#中使用夏令时处理时区

在C#中使用夏令时处理时区

C#
三国纷争 2021-04-27 13:14:42
我们有一个与航空有关的应用程序,特别是与航班有关的应用程序。时间必须存储在本地,所以我选择使用UTC时间+偏移量,但是现在我意识到这是一个错误的选择:通过将时区存储为偏移量,我无法跟踪原始时区,这在处理夏时制时会产生影响。例如,我可以将UT的阿尔卑斯山时间存储为UTC时间和-6偏移量,也可以将AZ的菲尼克斯时间存储为UTC时间和-6偏移量。但是当夏令时到来时,阿尔卑斯山的时间会改变,凤凰城的时间不会改变。因此,我需要存储正确的时区,并且我发现还有使用不同语法的不同列表,因此我假设存在不同的标准。在C#中,将本地时间与本地时区一起存储以使其与夏时制一起工作的最佳选择是什么?
查看完整描述

2 回答

?
Cats萌萌

TA贡献1805条经验 获得超9个赞

从问题评论中的讨论中,我了解到您正在使用航班时刻表-即将来要起飞的时间。实际上,这是当地时间比UTC时间重要的情况。

由于您拥有当地的出发时间和地点(例如:盐湖城的5:00 PM),因此您应该在计划的出发时间数据库中存储两个值:

  • 17:00 -出发当地时间

  • SLC -与时间相关的位置

如果这是这次航班的特定情况,那么您还应该存储日期:

  • 2018-06-01T17:00-具体的当地相关出发时间

  • SLC -与当地时间有关的位置

这些是与业务用例上下文相关的详细信息。不要通过将它们转换为UTC来忽视它们

就是说,您可以考虑将它们存储为DateTimeOffset2018-06-01T17:00-06:00),这对于给定的实例而言转换为UTC并不重要。但是,此方法存在两个问题:

  • 由于偏移量可能会更改,因此无法重复使用。

  • 即使对于单个实例,偏移量也可能会发生变化-如果控制时区的政府决定在发生这种情况之前更改标准偏移量或夏令时规则。如果您采用一种DateTimeOffset方法或基于UTC的方法,则必须准备面对此类变化重新计算未来的事件。(有关此内容的更多信息,请参阅我的博客文章:关于埃及时区变化的时机不可避免的时区混乱。还有无数其他示例。)

关于位置-因为您正在使用的上下文数据适用于航空业,所以我建议使用SLC上面显示的IATA机场代码。在其他情况下,可能会存储IANA时区标识符(例如America/Denver)或Windows时区标识符(例如)Mountain Standard Time

您可能会发现我的“机场时区”要点(代码和输出表)对于使用IATA机场代码非常有用。您必须决定这些数据将如何在您的系统中流动。如果您在Windows上运行,并且想使用TimeZoneInfo该类将时间转换为不同的时区,请使用此处显示的Windows时区ID。如果要使用IANA时区ID,请考虑使用Noda Time,也可以使用我的TimeZoneConverter库。这里有几种不同的选项,因此请仔细研究所有选项,然后选择对您有意义的选项。

恕我直言,野田时间将是一个不错的选择。您不仅会获得出色的时区支持,而且还能够使用类似LocalTimeLocalDateTime与所描述的场景非常吻合的类型。


查看完整回答
反对 回复 2021-05-08
  • 2 回答
  • 0 关注
  • 355 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信