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
条件多次命中,以下区域满足条件。
所以,我进一步缩小了代码范围
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 并采用夏令时
有没有啥简单的方法可以在 C/C++ 中获得 Linux 下的夏令时转换时间