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?
DateTime
只区分UTC
和Local
(和Unknown
)。这会导致各种各样的问题,考虑到两个不同的Local
时间当然可能是两个不同区域的本地时间,并且Local
时间确实可能是UTC
时间,如果它在使用UTC的时区(例如冰岛全年,或爱尔兰在冬季)。因此,DateTime
可以是Local
,并且与UTC
的时间差为0。
两者之间没有完美的往返方式,所以考虑Z
表示UTC
, +00:00
表示Local
(但与UTC相同的本地类型)是对这种情况的不完美折衷,通过提供DateTimeZoneHandling
使其不那么不完美,以便人们可以从折衷中进行调整。
使用DateTimeOffset
代替DateTime
是处理DateTime
与日期、时间和偏移量组合不匹配的另一种方法。