JavaScript JSON stringify格式化Date不正确

有同学问了我一个很特殊的需求,他需要格式化date为json格式,可是结果却不正确。

我们来试一把:

new Date();
// Sat Jan 09 2016 12:34:05 GMT+0800 (CST)
JSON.stringify(new Date());
// "\"2016-01-09T04:34:28.242Z\""

看上去确实不一样——不过我们能看到,差8个小时,不就是GMT(UTC)的标准时间跟我们的区别么?

也就是说,JSON.stringify会默认转换时间,解决的方案在stackoverflow也有:

x = new Date();
x.setHours(x.getHours() - x.getTimezoneOffset() / 60);

这样能够还原成UTC,就完全一致了。

当然,最好的自然还是使用时间戳啦:

Date.parse(new Date());
(new Date()).valueOf();
new Date().getTime()
其中:第一种获取的时间戳是把毫秒改成000显示,第二种和第三种是获取了当前毫秒的时间戳。

当然,没有想到什么特殊的需求需要用客户端获取时间给服务端……

另外,JSON.stringify以前竟然不知道,孤陋寡闻了。

最后想说的是,json没有标准时间格式这一说,在json.org中也有说明关于json的数据(value)类型。

参考:

如果您觉得文章不错,可以通过赞助支持我

标签: 知识, 代码段, 语法

已有 7 条评论

  1. Everlasting

    66666666
    我最后也是在客户端转成毫秒数加8小时解决的。数据库就存标准时间不管了= =

    1. 我想说的是……一般都是从服务端获取时间……

  2. 这种时间格式是 ISO 8601 的,最后面的 Z 表示它是一个 UTC 时间,并没有什么不对的。
    如果需要处理它,应该是传给服务端后,再根据时区去处理 +8 小时才符合逻辑→_→

    1. 对,但一般不应该是以服务器时间作为统一时间来进行操作和存储么=_=从前端丢进去这种,除非是有什么核对的需求吧?

      1. lujjjh

        把 Node.js 也考虑进去的话也可能是服务端返回给客户端,比如说有一个 API 返回服务器时间。

        观点 1:不论传输方向是服务器到客户端,还是客户端到服务器,传输的日期(时间)都应该带有时区(JSON.stringify() 返回的时区是显式的,转化为 UTC 时间戳后的时区是隐式的)。

        观点 2:不应当手动“修正”时区,因为时间本来是对的,“修正”时间后时区没有跟着变化。

        解决方法:StackOverflow 里下面几个答案才是正确的。new Date() 本来就支持这种时间格式。

        > new Date('2016-01-09T04:34:28.242Z')
        Sat Jan 09 2016 12:34:28 GMT+0800 (中国标准时间)
        
  3. Lion

    注意大小写。

    另外,JSON.Stringify 以前竟然不知道,孤陋寡闻了。
    1. 好,感谢,已修改

添加新评论