【发布时间】: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 之后的多个时区可能在同一时刻具有完全相同的时间。