我有一套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
答案 0 :(得分:3)
让我试着澄清一些事情......
首先,DateTime
和DateTimeOffset
都是时区感知。 DateTime
可能知道它是UTC
或Local
,但仍然无法知道本地真正的含义。 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
且具有特定时区 偏移以区分其他不明确的时刻。
这种结构对你的情况会更好。