C# 在WebAPI 2中严格执行ISO8601日期格式

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:

序言

默认情况下,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:12 AM
UTC

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

问题


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

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

以下是魔术诞生的地方的链接:

  • 读取日期时间值:
  • 分析日期时区:
  • 写入日期时间值

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

如果没有时间表示形式的UTC关系信息, 时间假定为当地时间。虽然这样做可能是安全的 假设在同一时区通信时为本地时间,则为 在跨不同时区的通信中使用时不明确。信息技术 通常最好使用 标准的符号


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

这个问题的标题应该是“严格执行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