mongodb怎么存储本地时间

基于node开发,使用mongoosemongodb操作,直接存储时间是存为UTC时间,与北京时间是相差八个钟的,如何在存储的时候,把时间先转为北京时间再存呢?有试过网上说的方法,好像不行~

阅读 10.3k
3 个回答

存取都是utc 不会造成时间差的问题啊。

如果为了观看方便,可以存string,但是会导致不能查询.
也可以存时间戳Date.now() 这样就无视时区。

存储是强制用UTC时间存储的,但是你获取时可以转换为本地时间的,有个mongodb的全局设置,可以设置为自动转换为本地时间的

其一,时间的解析问题

首先给你看同段代码的两个不同结果(分别是在不同时区系统,但代码是一致的):

我当前系统的node命令
clipboard.png

新建的一个linux系统,node命令
clipboard.png

你可以看到的是,同段代码,两个getTime()的结果是不一致的。如果没有指定时区,则node会默认取当前的时区来创建时间。mongodb 也是一样的Date

其二,mongodb存储时间默认用的是 ISODate 格式

文档是这么解释的 new Date() returns the current date as a Date object. The mongo shell wraps the Date object with the ISODate helper. The ISODate is in UTC.

let t = new Date()
console.log(t.toUTCString()) // Mon, 02 Dec 2019 07:30:41 GMT
console.log(t.toString()) // Mon Dec 02 2019 15:30:41 GMT+0800 (GMT+08:00)
await new Temp({ name: '嘎嘎123', date: t }).save() 
console.log(JSON.stringify(await Temp.findOne())) 
// {"_id":"5de4bda1c7793356544ecdd5","name":"嘎嘎123","date":"2019-12-02T07:30:41.708Z","__v":0}
下面是用命令打印数据,注意图片中的Date,不是简单的字符串哦!
clipboard.png

结语

正常开发中,数据库显示是ISODate格式也不是很影响,开发中往往是传给前台展示用的。比如把ISODate(字符串)传给前端展示,那前端肯定是会取解析的(通过 new Date())。例如上述案例:

// 用本地浏览器控制台运行
new Date('2019-12-02T07:30:41.708Z').getHours() // 15

保证时间存取一致的解决方案:

  1. 存储时通过toISOString转换以下,比如 new Date('2019-12-02 07:42:32').toISOString(),或者时转时间戳传new Date('2019-12-02 07:42:32').getTime()
  2. 如果硬是要以'2019-12-02 07:42:32'这种不指定时区传,那么保证部署node服务的环境时区和你当前时区是一致的,这样的话也不影响。
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏