C# 在时间转换中处理夏令时

Posted

技术标签:

【中文标题】C# 在时间转换中处理夏令时【英文标题】:C# Handling Daylight Saving in Time Conversion 【发布时间】:2021-03-09 12:22:20 【问题描述】:

我有一个日期字符串 2020-11-26T14:24:29-08:00,它被传递到后端 ASP NET MVC 应用程序。

我正在使用以下代码解析日期/时间字符串:

    DateTime dateTime = DateTimeOffset.ParseExact("2020-11-26T14:24:29-08:00", 
                                                  "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz",
                                                  CultureInfo.InvariantCulture).DateTime;

此代码给我的时间比实际时间少 1 小时。这是因为夏令时。

现在,我想知道时区是否启用了夏令时。所以我写了下面的代码:

var offset = DateTimeOffset.ParseExact("2020-11-26T14:24:29-08:00", 
                                       "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", 
                                       CultureInfo.InvariantCulture);

TimeZoneInfo zone = null;
foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())

    if(zone.BaseUtcOffset == offset.Offset)
            zone = z;                        // this runs multiple times   

以上代码if条件多次命中,以下区域满足条件。

育空标准时间 太平洋标准时间(墨西哥) UTC-08 太平洋标准时间

所以,我进一步缩小了代码范围

var offset = DateTimeOffset.ParseExact("2020-11-26T14:24:29-08:00", 
                                       "yyyy'-'MM'-'dd'T'HH':'mm':'sszzz", 
                                       CultureInfo.InvariantCulture);

TimeZoneInfo zone = null;
foreach (TimeZoneInfo z in TimeZoneInfo.GetSystemTimeZones())

    if(zone.BaseUtcOffset == offset.Offset && zone.SupportsDaylightSavingTime)   // added second condition
            zone = z;                        // this runs multiple times   

这次我得到了三个:

育空标准时间 太平洋标准时间(墨西哥) 太平洋标准时间

是否可以获得准确的时区? (我知道这个用户在Pacific Standard Time) 或者可以使用任何(第一个)并添加一个小时以获得正确的时间?

【问题讨论】:

为什么不使用 NodaTime 来处理所有的转换细节? “这段代码给了我比实际时间少 1 小时的时间”——这听起来不太可能。该值直接指定偏移量。你说的那句话究竟是什么意思? “实际时间”是什么意思?从根本上说,您是说您不相信您获得的值正确地代表了打算发送的任何值吗? @vc74 这有什么帮助?请赐教。 此外,如果他们真的在太平洋时间(并且目前正在遵守太平洋标准时间),那么 -08:00 是正确的 UTC 偏移量,所以我认为没有任何差异不会 是由于 DST。 它不会解决您的具体问题,但我倾向于在我的代码中涉及时区时立即使用它。为了回答您的问题,我认为没有办法将偏移量映射到时区,因为 DLS 之后的多个时区可能在同一时刻具有完全相同的时间。 【参考方案1】:

如果您只能使用该日期时间字符串,我怀疑您必须希望他们给您的偏移量与他们的时区夏令时一致(因此对于同一位置可能会有所不同) .

我认为可能需要更多信息才能给出有用的答案。这个值是从哪里来的,夏令时有什么用?

【讨论】:

该值来自用户浏览器的 javascript 代码。日期字符串由FullCalendar返回 好的,所以我敢打赌它会给你已经考虑到夏令时的偏移量。如果您出于某种原因需要具体了解是否是夏令时,我会看看您是否可以从日历中获取时区并直接操作 UTC 时间(以 Z 结尾)。不知道有多少帮助,如果没有看到完整的问题就很难知道。

以上是关于C# 在时间转换中处理夏令时的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008 函数将 GMT 时间转换为 AEST 并采用夏令时

为啥 R 在多年之间不能始终如一地处理夏令时?

根据夏令时转换存储在数据库中的时间

有没有啥简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间

如何从 Unix 纪元时间转换并在 Python 中考虑夏令时?

时区转换和夏令时