【问题标题】:C# Handling Daylight Saving in Time ConversionC# 在时间转换中处理夏令时
【发布时间】: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 之后的多个时区可能在同一时刻具有完全相同的时间。

标签: c# time dst


【解决方案1】:

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

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

【讨论】:

  • 该值来自用户浏览器的 Javascript 代码。日期字符串由FullCalendar返回
  • 好的,所以我敢打赌它会给你已经考虑到夏令时的偏移量。如果您出于某种原因需要具体了解是否是夏令时,我会看看您是否可以从日历中获取时区并直接操作 UTC 时间(以 Z 结尾)。不知道有多少帮助,如果没有看到完整的问题就很难知道。
猜你喜欢
  • 2013-03-18
  • 2018-03-27
  • 2019-12-16
  • 2021-01-20
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 2016-08-10
  • 2017-08-28
相关资源
最近更新 更多