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

C# 在C语言中使用夏令时处理时区#,c#,.net,timezone,C#,.net,Timezone,我们有一个与航空相关的应用程序,特别是航班 时间必须存储在本地,因此我选择使用UTC时间+偏移量,但现在我意识到这是一个错误的选择: 通过将时区存储为偏移量,我无法跟踪原始时区,这在处理夏时制时会产生影响 例如,我可以在阿尔卑斯山存储一个时间,UT为UTC时间和-6偏移量,在凤凰城存储一个时间,AZ为UTC时间和-6偏移量 但当夏时制到来时,阿尔卑斯山的时间会改变,但凤凰城的时间不会改变 所以,我需要存储正确的时区,我已经看到,也有不同的列表,具有不同的语法,所以我假设有不同的标准 在C#中,使

我们有一个与航空相关的应用程序,特别是航班


时间必须存储在本地,因此我选择使用UTC时间+偏移量,但现在我意识到这是一个错误的选择:

通过将时区存储为偏移量,我无法跟踪原始时区,这在处理夏时制时会产生影响

例如,我可以在阿尔卑斯山存储一个时间,UT为UTC时间和-6偏移量,在凤凰城存储一个时间,AZ为UTC时间和-6偏移量

但当夏时制到来时,阿尔卑斯山的时间会改变,但凤凰城的时间不会改变

所以,我需要存储正确的时区,我已经看到,也有不同的列表,具有不同的语法,所以我假设有不同的标准


在C#中,使用本地时区存储本地时间以使其与夏时制更改一起工作的最佳选项是什么?

正如我在评论中所写,不要存储本地日期。相反,将日期时间值存储为UTC,并在需要显示时转换为本地日期时间。
您可以使用类的方法来实现这一点

这意味着您还必须保留一个位置列表以及与之关联的任何时区信息-例如,
耶路撒冷
将与
以色列标准时间

罗马
W.欧洲标准时间

夏威夷
夏威夷标准时间

等等(我打赌你可以在网上的某个地方找到这样的列表。)
请注意,
ConvertTimeFromUtc
方法也可以为您处理夏令时问题

然后,您可以执行以下操作以按位置获取本地时间:

DateTime GetLocalDateByCityName(DateTime utc, string cityName)
{
    var timeZoneInfoId = GetTimeZoneInfoIdByCityName(string cityName);
    return TimeZoneInfo.ConvertTimeFromUtc(utc, TimeZoneInfo.FindSystemTimeZoneById(timeZoneInfoId);
}

当然,在
GetTimeZoneInfoIdByCityName
中,您可以获得特定城市的时区信息

从问题评论中的讨论中,我了解到您正在处理航班时刻表,即未来航班的预计起飞时间。在这种情况下,当地时间比UTC时间更重要

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

  • 17:00
    -出发的相关当地时间
  • SLC
    -与时间相关的位置
如果这是本次航班的特定事件,则您还应存储日期:

  • 2018-06-01T17:00
    -出发的具体相关当地时间
  • SLC
    -与本地时间相关的位置
这些是与您的业务用例上下文相关的细节。将它们转换为UTC时,不要忽略它们

这样说,您可以考虑将它们存储为<代码> DATEMEMPLOOS(<代码> 2018—01- 017T17:00 -06:0/COD>),这使得对于给定实例转换为UTC微不足道。然而,这种方法存在两个问题:

  • 它无法处理重复,因为偏移可能会更改
  • 即使是单个实例,如果控制时区的政府决定在该事件生效之前更改其标准偏移量或夏令时规则,偏移量也可能会更改。如果您确实采用了
    DateTimeOffset
    方法或基于UTC的方法,您必须准备好面对此类更改重新计算未来事件。(有关这方面的更多信息,请参阅我的博客文章:和。还有无数其他示例。)
关于位置-由于您使用的是适用于航空业的数据,因此我建议使用IATA机场代码,如我在上面展示的
SLC
。在其他上下文中,可以存储IANA时区标识符,如
America/Denver
,或Windows时区标识符,如
Mountain Standard time

您可能会发现使用IATA机场代码很有用。您必须决定数据将如何流经您的系统。如果您在Windows上运行,并且希望使用
TimeZoneInfo
类将时间转换为不同的时区,请使用此处显示的Windows时区ID。如果您想使用IANA时区ID,请考虑使用,或者您可以使用我的库。这里有几个不同的选择,所以仔细地探索它们,选择对你有意义的


野田时间会是个不错的选择,IMHO。您不仅可以获得出色的时区支持,还可以使用类似
LocalTime
LocalDateTime
的类型,这些类型与所描述的场景非常吻合。

正如您也提到的,存储本地时间是一个错误的选择,我也同意这一点。我建议,如果您可以开始更改当前程序以存储UTC时区(具有向后兼容性),您可以同时存储UTC和本地时区值。你不需要在什么国家和什么时候有日光节约的所有边缘案例上工作。您可以依靠系统DLL根据用户的区域设置将UTC值转换为本地值。“时间必须存储在本地”。我真的为你感到抱歉。这个权利是必须处理夏时制只会使疯狂之旅更快。请听从曾经走过这条路的人的建议,为了你自己的理智,重新考虑这种方法。用户的区域设置在这里不相关,因为在航空业中,显示的时间总是机场所在地的时间。问题是,如果时间存储在UTC+偏移量中,并且夏时制生效,我无法进行校正,因为如果我只存储偏移量,我不知道该时间属于哪个区域。将其存储在UTC中,并在本地时间显示。需要时转换