在Web API 2中严格执行ISO 8601日期格式

时间:2015-03-17 13:46:53

标签: c# datetime serialization json.net asp.net-web-api2

序言

默认情况下,JSON序列化程序通过IsoDateTimeConverter

支持ISO DateTime标准

通过一些额外的自定义,我们可以强制所有日期时间都是UTC(http://www.asp.net/web-api/overview/formats-and-model-binding/json-and-xml-serialization

jsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc

这会再次按预期运行,1972-09-18T02:29:12.264513Z1972-09-18T04:29:12.264513+02:00在序列化后都等同于1972-09-18 02:29:12 AM

问题

不幸的是,不考虑时区偏移后缀也成功序列化。因此1972-09-18T04:29:12.264513等同于1972-09-18 04:29:12 AM UTC。

这里的问题是我们假设消费者知道日期格式并且理解(根据我们的文档)日期总是假定为UTC。

问题

如果缺少时区偏移后缀,有没有办法强制序列化失败,以便我们不做任何假设?

3 个答案:

答案 0 :(得分:2)

我只是查看了Json.NET代码,我担心这是不可能的(或者至少极其困难,因为需要覆盖JsonTextReader / JsonTextWriter)才能失败如果省略时区偏移后缀。与解析和序列化各种数据类型相关的所有代码都是内部的。

下面是魔术正在变化的地方的链接:

答案 1 :(得分:1)

看看规格。不表示时区偏移的日期时间应假定为当地时间:

  

如果没有给出时间表示的UTC关系信息,   假设时间是在当地时间。虽然它可能是安全的   假设在同一时区进行通信时的本地时间   用于跨不同时区进行通信时不明确。它   通常优选表示使用时区(区域指示符)   标准的表示法。 - Wikipedia

因此,最好坚持商定的标准。因此,严格执行标准意味着我应该允许暂停时区偏移。

答案 2 :(得分:0)

这个问题的标题应该说"严格执行RFC 3339日期时间......"

那是因为ISO 8601实际上是doesn't require Time zone designator in the value。需要它的格式是RFC 3339 date-time。 RFC 3339是ISO8601格式的子集,也是在Internet上广泛使用的格式(JSON Schema,OpenAPI)。

至于Newtonsoft JSON库的解决方案(以及因此ASP.NET和现在使用它的许多框架),我已经提出了this issue以使其成为可能,但是现在只有一个{{3} }。