NodeJS操作MySQL取出来的datatime与实际差8小时

nodejs操作mysql取出来的datatime与实际差8小时。

MySQL中执行

SELECT NOW();

打印出来的结果是

2019-01-16 11:05:40

Node中执行

db.query(`SELECT NOW() as tm`, (err, ret)=>{
  const tm = ret[0].tm;
  console.log(ret[0].tm);
})

结果为
2019-01-16T03:05:40.000Z

相差了8个小时。
其实用moment插件转换一下,是正常的
npm i moment --save

const moment = require('moment');
db.query(`select now() as tm`, (err, ret)=>{
  const tm = ret[0].tm;
  console.log(moment(tm).format('YYYY-MM-DD hh:mm:ss'))
})

结果为

2019-01-16 11:05:40

原因是
数据库里的时区,发现是中国标准时CST
而node中mysql默认使用的是UTC通用标准时(协调世界时,又称世界统一时间、世界标准时间、国际协调时间)

解决方案:
1.将数据库的时区改成UTC
查看当前数据库时区

show variables like '%time_zone%'
system_time_zone:CST
time_zone:SYSTEM

下面有两种修改方法,第一个是临时修改,第二个是永久修改
(1).临时修改用sql命令

# 设置全局时区 mysql> set global time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec) 
# 设置时区为东八区 mysql> set time_zone = '+8:00'; 
Query OK, 0 rows affected (0.00 sec) 
# 刷新权限使设置立即生效 mysql> flush privileges; 
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like '%time_zone%';
 +------------------+--------+
 | Variable_name | Value |
 +------------------+--------+
 | system_time_zone | EST |
 | time_zone | +08:00 | 
 +------------------+--------+
 2 rows in set (0.00 sec)

(2).永久修改,修改my.cnf配置文件
打开编辑my.cnf文件

vi /etc/mysql/my.cnf

在mysqld下边的配置中添加一行

default-time_zone = '+8:00'

重启mysql 服务

service mysql restart

2.在连接mysql的配置文件中添加一条,timezone:"08:00",如下

var pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '123',
    database: 'test',
    timezone:"08:00"
});

然后,Node中执行

db.query(`SELECT NOW() as tm`, (err, ret)=>{
  const tm = ret[0].tm;
  console.log(ret[0].tm);
})

结果为

2019-01-16 11:05:40
posted @ 2021-03-31 20:35  万般自然  阅读(1034)  评论(0编辑  收藏  举报