使用正确的时区和种类解析日期时间c#

Shi*_*hti 7 c# datetime parsing datetimeoffset

我在数据库中有一个日期时间,我使用SqlDataReader读取然后将其转换为(DateTime).演员之后的Kind财产是DateTimeKind.Unspecified.

然后我有另一个字符串,我从其他来源读取.它的格式是这样的2016-01-20T22:20:29.055Z.我这样做DateTime.Parse("2016-01-20T22:20:29.055Z"),它的Kind属性是DateTimeKind.Local.

如何正确解析两个日期时间以进行比较?我需要使用DateTimeOffsets吗?我该如何解析它们?

谢谢

Jam*_*See 7

因为 SQLReader 无法合理推断 DateTimeKind,所以它保持未指定。您需要使用DateTime.SpecifyKind将 SQLReader 输出中的 DateTimeKind 更改为适当的值。如果您只处理 UTC 和一个一致的本地时区,这可以正常工作;否则,您确实应该在代码和 SQL 数据库中使用 DateTimeOffset。

字符串“2016-01-20T22:20:29.055Z”符合ISO 8601标准,是一个 UTC 日期;但是,DateTime.Parse只有 1 个参数可以最终执行到本地时间的转换。根据文档:

通常,Parse 方法返回一个 DateTime 对象,其 Kind 属性为 DateTimeKind.Unspecified。但是,Parse 方法也可能执行时区转换并根据 s 和样式参数的值不同地设置 Kind 属性的值:

  • 如果 s 包含时区信息,则将日期和时间转换为本地时区的时间,Kind 为 DateTimeKind.Local。
  • 如果 s 包含时区信息,并且样式包含 AdjustToUniversal 标志,则日期和时间将转换为协调世界时 (UTC),并且 Kind 为 DateTimeKind.Utc。
  • 如果 s 包含 Z 或 GMT 时区指示符,并且样式包含 RoundtripKind 标志,则日期和时间将被解释为 UTC,而 Kind 为 DateTimeKind.Utc。

另请参阅Derek Fowler 博客中 .NET 和 SQL Server中的UTC 陷阱,以获取有关该主题的更多报道。

  • 但这不就是“Z”的用途吗?为什么它仍然显示为“DateTimeKind.Local”。它应该是 `DateTimeKind.Utc` 因为“Z”是 UTC,这不正确吗? (4认同)