9

我不确定是我遗漏了什么 - 还是 IE 或 Json.Net。

但基本上这是有效的:

new Date("2012-08-03T12:36:54.743Z")

这失败并出现“无效日期”错误:

new Date("2012-08-03T12:36:54.74Z")

第二个日期在 SQL Server 中存储为:

2012-08-03 12:36:54.740

然后使用 Json.Net 将其序列化为 JSON - Json.Net 确实将日期序列化为2012-08-03T12:36:54.74Z,有效地切断了最后一个 0。

我的问题:

  • 这是 IE 中的预期行为 - 它需要以毫秒为单位的所有 3 位数字才能工作?
  • 这是 Json.Net 中的预期行为 - 它总是会切断日期中的最后一个 0 吗?
4

2 回答 2

11

我不能告诉你它是否是有意的,但我已经做了很多搜索,我也没有找到这个问题的真正解决方案。看来我们不得不接受 IE 只接受三位数的事实。解决此问题的唯一方法(对我而言)是在序列化时使用 Json.NET 的自定义转换器:

string json = JsonConvert.SerializeObject(
    whatEver,
    new IsoDateTimeConverter
        {
            DateTimeFormat = "yyyy-MM-dd\\THH:mm:ss.fffK"
        }
    );

(仅使用 Json.NET 4.0.8 和 4.5.8 测试)

这会强制 Json.NET 使用 3 位小数。

据我所知,Json.NETDateTime以 ISO 格式序列化值,并以最大必要精度省略“第二个”值的小数位后面的零。

这匹配的输出

someDateTimeValue.ToString("yyyy-MM-dd\\THH:mm:ss.FFFFFFFK")
  • 一个普通的DateTimelikeDateTime.UtcNow最多会被序列化为 7 位数字,因为那是 a 的精度DateTime(以 Ticks 为单位)。
  • 如果“第二”部分的DateTime小数位数较少,Json.NET 将省略那些尾随零。
  • 因此,像这样的日期值在“秒”值后面将不DateTime.Today包含任何数字,因为它恰好是0.

另请参阅自定义日期和时间格式字符串的描述。

于 2012-08-06T13:01:11.667 回答
1

是IE。我找到的最全面的解释和答案是JavaScript:While browsers support parsing of ISO-8601 Date String with Date.parse

尤其

IE9 在毫秒数上失败,位数不是 3:(在 IE10 中修复)

于 2013-08-26T01:27:55.050 回答