javascript对Date进行JSON序列化丢失时区

问题背景

js中获取当前时间,并进行json序列化,传至后台,发现存入数据库中后时间早了八个小时。

        var msgObj= {
            msgId:RndNum(16),
            msgType:messageType,
            data:message,
            fromUid:fromUid,
            toUid:toUid,
            createAt:new Date()
        };

		var json = JSON.stringify(msgObj)

逐步调试差错

一步一步调试发现问题所在:

  • js获取的本地时间正确:
    在这里插入图片描述
    在这里插入图片描述

以上是浏览器中通过RFC-822格式展示的时间,GMT+8即格林威治时间+8小时,正好是中国的东八区时间。

  • JSON序列化后时区信息丢失
    在这里插入图片描述
    此处是按照RFC-3339格式展示的时间,以下为RFC-3339格式关于时区的规则:
  最末尾一位字母表示时区
  字母A至I 代表+0100+0900
  字母k至M 代表+1000+1200
  字母N至Y 代表-100-1200
  字母z    代表+0000

即,本地时间经过JSON序列化之后,变成了格林威治时间,数值上比本地时间要小8个小时,即2021-02-16T09:18:36
于是在golang后台获取得到的元数据为:
在这里插入图片描述
json反序列化后用time.Time类型装载得到的时间为:
在这里插入图片描述
在我的golang后端程序中,连接mysql时没有加上&loc=Local属性,导致上述丢失了时区信息的时间入库后比东八区时间小了八个小时。
在加上&loc=Local属性后,上述时间入库后则是正确的东八区时间
在这里插入图片描述

在这里插入图片描述


解决办法

到这里,我遇到的问题实际上已经解决,但是依然没有解决JSON解析Date丢失时区的问题,可以这样做:

  • 重写Date类型的toJSON方法,通过可以保留时区信息的功能接口进行stringfy,例如,使用moment.js的fomat()方法:
    1. 引入moment.js脚本文件<script type="text/javascript" src="http://cdn.staticfile.org/moment.js/2.24.0/moment.js"></script>
    2. 重写Date的toJSON方法Date.prototype.toJSON = function(){ return moment(this).format(); }
    3. 注意到,这里的无参format()方法会按照RFC-3339格式对当前Date对象stringfty,能够保留本地的时区。
      在这里插入图片描述

如此操作以后,js页面传到后台的时间就会包含时区信息,存入数据库后依然正确。
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值