Mysql和Mongodb查看数据时,看着时间都不对。其实这和时区有关。

new Date()

  • 控制台运行nodejs ,,不要用浏览器控制台。
  • new Date()直接打印,会显示世界标准时间,和北京时间差8个时区,即8h。同理, new Date(‘2020-11-30 14:15:10’)直接打印,结果是 2020-11-30T06:15:10.000z ,差着8h 。
  • 想要获取当前时区的时间,只需要 toString() 就可以了。
  • 如果想要格式,可使用date-fns的format ,简单易用。

    mongodb 和 mysql

    和js Date 一样,mongodb mysql存储的时间,直接显示也是时间标准时间,和北京时间差8h。例如显示"createdAt":"2020-11-30T06:19:14.000z"
    同理,如果想要显示为当前时区的时间, 也只需要 toString() 即可。所以,可以直接把这个时间返回给前端,让前端自己去显示当前时区的时间。
    1. const d = new Date('2020-11-30T06:19:14.000z')
    2. d.toString() //获取使用date-fns format
    如果在查询数据库时,要进行时间比较,那可以按统一标准︰把时间都换成世界标准时间,进行比较。如要查询mongodb 里 createdAt 在 2020-11-20: 0:00:002020-11-30 23:59:59 的数据。 ```javascript const d1 = new Date( ‘2020-11-20: 0:00:00’)//转换为世界标准时间 const d2 = new Date( ‘2020-11-30 23:59:59’)//转换为世界标准时间 // 对d1和d2 ,使用mongoose进行比较即可
  1. <a name="bBQKv"></a>
  2. # 总结
  3. 世界上有那么多时区,那么多显示规则。而计算机存储时间的形式都是统一的,也必须统一,否则多乱。所以,只有 `toString()` 才分时区,而 Date 数据不分时区,无论在js中还是数据库中。
  4. 另外,Docker虚拟机里,默认没有各个时区,需要自己在Dockerfile里配置。
  5. ```javascript
  6. # Dockerfile
  7. FROM node: 14
  8. wORKDIR /app
  9. COPY . /app
  10. #设置时区
  11. RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai'>/etc/timezone
  12. CMD npm i && npm run prd-dev && npx pm2 log