zoukankan      html  css  js  c++  java
  • 解决nodejs中json序列化时Date类型默认为UTC格式

    在nodejs中,json序列化时Date类型时,默认转为UTC格式。

    如下图

    zhupengfei@DESKTOP-HJASOE3 MINGW64 /d/MyProject/exp2
    $ node
    > new Date();
    2018-04-24T12:32:55.590Z
    >

    上面只是一个例子,下面我用一个更具体化的例子来展示一个这个情况,我们在开发WEB项目中,经常用到Express组件,

    我们就用express创建了一个demo项目,我们现在要提供一个api接口,返回一些信息

    返回操作员信息,这是很正常的接口吧,

    大家看一下,接口log日志中显示的时间是晚上20点,可是接口返回的JSON数据即是12点,差8个小时。

    为什么呢?

    原因是因为JSON在序列化的时候,默认将日期类型转换为了UTC格式的时间,UTC格式是不带时区的,或者说是0时区。客户端根据本地的时区自动再转换。

    JSON可能是想避免大家在时区上弄错,造成时间不一致。但是带来的问题就是必须对时间进行处理,不处理都不能使用。

    能不能默认输出包含时区呢,或者不需要再处理,直接能用呢?

    答案时肯定的。以下介绍在express中的处理方法

    在bin目录下www文件中,增加以下代码

    复制代码
    function dateFormat(date, fmt) {
        if (null == date || undefined == date) return '';
        var o = {
            "M+": date.getMonth() + 1, //月份
            "d+": date.getDate(), //日
            "h+": date.getHours(), //小时
            "m+": date.getMinutes(), //分
            "s+": date.getSeconds(), //秒
            "S": date.getMilliseconds() //毫秒
        };
        if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + "").substr(4 - RegExp.$1.length));
        for (var k in o)
            if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
        return fmt;
    }
    
    Date.prototype.toJSON = function () { return dateFormat(this,'yyyy-MM-dd hh:mm:ss')}
    复制代码

    如下图

    这样输出就包含时区了,不再需要处理就可以直接使用了。

    总结:

    再次说明这并非是一个问题,开始的时候我们以为这个是Sequelize造成的,在github里也确实看到好多人在问为什么会这样?能不能解决呢,骂声一片,呵呵,我们就被误导了,英文不好嘛,所以看不太明白,以为是Sequelize搞的呢,甚至于搞到要修改Sequelize源码,觉得方案不完美。其实当时好像也有大牛说这不是Sequelize的问题,当时也没注意。后来第二天,又查了一下,好像不是Sequelize的问题,那是nodejs的问题?在网上查了一下,也有人说是Nodejs问题的。于是请教了一下鹅厂出来的同事,定位了一下,终于找到根源了。

    原来是json序列化搞的鬼。

    所以说遇到问题,要查百度没错,但也不能全信,一定要自己思考一下,必要时动手验证一下。

    管理员审核不通过,说是图片太多了,没办法只能删除一些图片,重新再发了。

    作者:朱鹏飞 加我个人微信(zhupengfeivip)进入郑州IT微信交流群
    个人博客:https://zhupengfeivip.github.io/
    image.png
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    javascript的window.open()具体解释
    Async.js解决Node.js操作MySQL的回调大坑
    入门--JTBC系统学习(1)
    Hadoop1.2.1 全然分布式集群搭建实操笔记
    Hessian原理与程序设计
    pycharm最新注册方法 pycharm最新激活方法 2016pycharm最新注册方法
    如何修改linux时间? 校正linux系统的时间
    python 内建函数 type() 和 isinstance() 介绍
    标准类型内建函数 str()和 repr() (及 `` 运算符) 简单介绍
    标准类型内建函数 cmp()介绍
  • 原文地址:https://www.cnblogs.com/zhupengfei/p/8934072.html
Copyright © 2011-2022 走看看