JSON.NET将+00:00时区解析为本地时间,而将Z解析为UTC时间

本文关键字:时间 NET 而将 UTC 00时 JSON | 更新日期: 2023-09-27 18:05:26

我一直有一个Web API解析日期时间错误的问题,我已经追踪到JSON.NET。

问题是如果我发送这个datetime:

2015-07-28T19:06:01.000+00:00

在JSON PUT请求中,在我的模型中解析的DateTime将被转换为本地服务器时区的时间,具有c#本地日期时间类型,而不是UTC。

如果我发送这个datetime:
2015-07-28T19:06:01.000Z

它将正确地保持为UTC,具有c# datetime类型的UTC,这正是我想要的。

我可以解决这个问题,通过设置DateTimeZoneHandling:

SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.Utc;

但我不明白为什么它会这样做。根据ISO8601, Z和+00:00的意思应该是一样的,对吗?我担心将DateTimeZomeHandling全局设置为UTC,因为我可能不希望端点上的每个日期都被视为UTC。

是否有另一种设置,我可以告诉它考虑+00:00表示UTC?

JSON.NET将+00:00时区解析为本地时间,而将Z解析为UTC时间

DateTime只区分UTCLocal(和Unknown)。这会导致各种各样的问题,考虑到两个不同的Local时间当然可能是两个不同区域的本地时间,并且Local时间确实可能是UTC时间,如果它在使用UTC的时区(例如冰岛全年,或爱尔兰在冬季)。因此,DateTime可以是Local,并且与UTC的时间差为0。

另一方面,ISO 8601(更明智地)要么包含时区信息以及日期和/或时间,要么不包含。

两者之间没有完美的往返方式,所以考虑Z表示UTC, +00:00表示Local(但与UTC相同的本地类型)是对这种情况的不完美折衷,通过提供DateTimeZoneHandling使其不那么不完美,以便人们可以从折衷中进行调整。

使用DateTimeOffset代替DateTime是处理DateTime与日期、时间和偏移量组合不匹配的另一种方法。