我刚刚升级到OData Library的RTM版本。我注意到DateTime处理中似乎存在不一致之处,并且想知道是否有人可以解释我可能缺少的内容,或者实际上是否存在某些问题。除了RTM库,我还依赖于3/30/2012版本的MS-ODATA。
MS-ODATA以下列格式定义dateTimeUriLiteral(例如简化):
YYYY-MM-DDTHH:MM:SS.NS其中NS定义为nanoSeconds = 1 * 7DIGIT
MS-ODATA将VJsonDateTime定义为可怕的/Date(...)/格式。
但是,在详细的JSON序列化中使用库我们会看到dateTimeUriLiteral格式,而不是VJsonDateTime。此外,反序列化仅接受dateTimeUriLiteral格式。这看起来像规范和实现之间的冲突。
此外,dateTimeUriLiteral不允许时区偏移(例如ISO 8601格式的情况)。但是,当序列化的datetime对象被指定为DateTimeKind.Utc时,我们看到库发出'Z'终止字符(UTC的ISO 8601)。这看起来像规范和实现之间的冲突。
此外,当我们使用库反序列化具有终止“Z”的dateTimeUriLiteral时 - 反序列化的对象被标记为DateTimeKind.Local。无论是否有针对UTC指示符的规范WRT支持,这看起来都不正确。 “Z”应该导致反序列化失败,或者它应该导致标记为UTC(不是本地)的时间。
答案 0 :(得分:2)
详细JSON V3使用ISO DateTime格式(与XML使用的格式相同)。详细JSON V2和V1使用/Date(...)/格式。因此,它取决于您正在编写和阅读的有效负载版本。
dateTimeUriLiteral与Verbose JSON V3日期时间格式不同。 Verbose JSON V3中的一个使用Z(它与XmlConvert.ToString(datetime,XmlDateTimeSerializationMode.RoundtripKind)的文法相同)。
至于读取“Z”值。这似乎是一个错误。产品团队正在更详细地研究这个问题。可能的解决方法似乎是恢复到V2格式,或者改为使用DateTimeOffset值(没有这个问题)。