c# - JSON.NET 解析 +00 :00 timezone as local times, 但 Z 为 UTC

标签 c# json datetime json.net

我一直遇到 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 仅区分 UTCLocal(和 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/

相关文章:

json - YAJL流解析和Twitter流API

javascript - 从现在到某个日期时间至少已经过去了一个日历日吗?

c# - 在 Kinect 中测量

c# - 根据用户角色将 XML 站点地图加载到 MvcSiteMapProvider

python - 如何在 django 中应用 postman 过滤器?

mysql - 删除日期时间字段中的毫秒数

r - 将日期时间转换为 24 小时格式时出错

c# - Entity Framework 4.1 仅逆向工程代码

c# - 使用 VirtualFileDataObject 使用 IStream 拖放大型虚拟文件

ios - 将 NSData 转换为 NSString - NSLog 限制