我一直遇到 Web API 错误地解析日期时间的问题,我已追踪到 JSON.NET。
问题是如果我发送这个日期时间:
2015-07-28T19:06:01.000+00:00
在 JSON PUT 请求中,在我的模型中解析的 DateTime 将被转换为本地服务器时区的时间,C# 日期时间是本地的,而不是 UTC。
如果我发送这个日期时间:
2015-07-28T19:06:01.000Z
它将正确地保持为 UTC,C# 日期时间类型的 UTC 正是我想要的。
我可以通过像这样设置 DateTimeZoneHandling 来解决这个问题:
SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;
但我不明白为什么它首先要这样做。根据 ISO8601,Z 和 +00:00 应该是同一个意思吧?我担心将 DateTimeZomeHandling 全局设置为 UTC,因为我可能不希望端点上的每个日期都被视为 UTC。
是否有其他设置可以让我将 +00:00 视为 UTC?
最佳答案
DateTime
仅区分 UTC
和 Local
(和 Unknown
)。考虑到两个不同的 Local
时间当然可能是两个不同区域的本地时间,而 Local
时间确实可能是 UTC
time 如果它位于使用 UTC 的时区(例如冰岛全年,或冬季的爱尔兰)。因此,DateTime
可以是 Local
并且与 UTC
的时间差为零。
另一方面,ISO 8601(更为明智)要么包括时区信息以及日期和/或时间,要么不包括。
两者之间没有完美的往返方式,因此考虑 Z
表示 UTC
和 +00:00
表示 Local
(但与 UTC 相同的那种本地)是对这种情况的不完美折衷,通过提供 DateTimeZoneHandling
使人们可以从该折衷中进行调整,从而减少了一些不完美。
使用 DateTimeOffset
代替 DateTime
是处理 DateTime
与日期、时间和偏移量组合之间不匹配的另一种方法。
关于c# - JSON.NET 解析 +00 :00 timezone as local times, 但 Z 为 UTC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31688701/