解析时获取DateTime值的原始时区

时间:2015-06-27 08:11:38

标签: c# .net datetime

我有一套ISO 8601格式的DateTime文本表示,其中一些指定了时区。默认情况下,DateTime.Parse()会将它们调整为本地时区(或带有特殊选项的UTC),但在这两种情况下都会丢失原始时区。但是,我需要检测哪个DateTime字符串是用时区指定的,并获取其值以便进一步处理。

关于如何做到这一点的任何想法?

UPD样本输入:

2015-06-26T22:57:09Z
2015-06-26T22:57:09
2015-06-26T22:57:09 + 01:00

1 个答案:

答案 0 :(得分:3)

让我试着澄清一些事情......

首先,DateTimeDateTimeOffset都是时区感知。 DateTime 可能知道它是UTCLocal,但仍然无法知道本地真正的含义。 DateTimeOffset稍好一些,它保持UTC时间UTC offset。但是,这些还不足以确定时区,因为不同的时区可以有相同的偏移量。

DateTime.Parse 通常DateTime作为Kind返回Unspecified。它返回;

  • Local当您的字符串包含时区信息时。
  • UTC当您的字符串包含时区信息并使用AdjustToUniversal样式时,您的字符串具有Z或GMT指示符并使用RoundtripKind样式。

这就是DateTime.Parse("2015-06-26T22:57:09")返回Unspecified的原因,但DateTime.Parse("2015-06-26T22:57:09Z")DateTime.Parse("2015-06-26T22:57:09+01:00")都将Local作为Kind返回。这就是为什么无论你使用哪种,你都不会得到真正的时区信息。

我建议你改用NodaTime。它具有定义的ZonedDateTime结构;

  

特定时区内的LocalDateTime 且具有特定时区   偏移以区分其他不明确的时刻。

这种结构对你的情况会更好。