C# 在WebAPI 2中严格执行ISO8601日期格式
序言 默认情况下,JSON序列化程序通过C# 在WebAPI 2中严格执行ISO8601日期格式,c#,datetime,serialization,json.net,asp.net-web-api2,C#,Datetime,Serialization,Json.net,Asp.net Web Api2,序言 默认情况下,JSON序列化程序通过IsoDateTimeConverter 通过一些额外的定制,我们可以强制所有日期时间都使用UTC() 这同样适用于序列化后的1972-09-18T02:29:12.264513Z和1972-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:
IsoDateTimeConverter
通过一些额外的定制,我们可以强制所有日期时间都使用UTC()
这同样适用于序列化后的1972-09-18T02:29:12.264513Z
和1972-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
问题
如果缺少时区偏移后缀,有没有办法强制序列化失败,这样我们就不会做出任何假设?我只是查看了Json.NET代码,我很惊讶这是不可能的(或者至少非常困难,因为需要重写
JsonTextReader
/JsonTextWriter
)如果省略时区偏移后缀,则失败。所有与解析和序列化各种数据类型相关的代码都是内部代码
以下是魔术诞生的地方的链接:
- 读取日期时间值:
- 分析日期时区:
- 写入日期时间值
因此,最好坚持商定的标准。因此,严格执行该标准意味着我应该允许时区偏移被删除。这个问题的标题应该是“严格执行RFC 3339日期-时间…” 那是因为实际上是ISO8601。需要它的格式是。RFC 3339是ISO8601的一个子集,也是互联网上广泛使用的格式(JSON模式,OpenAPI),这也是RFC 3339的目标:用他们自己的话来说,格式“应该在互联网上的新协议中使用”,详细的理由是“由于全球约23/24的地区无法解释不合格的本地时区,因此不合格的本地时区的互操作性问题被认为是互联网无法接受的。”
至于Newtonsoft JSON库的解决方案(以及因此产生的ASP.NET和现在使用它的许多框架),我已经提出要使遵循RFC 3339建议变得更简单,但目前只有一个
jsonFormatter.SerializerSettings.DateTimeZoneHandling = Newtonsoft.Json.DateTimeZoneHandling.Utc