问题:

1.node+Mysql,查看数据库时区显示正确,但查询时,显示的确是另一个时区的时间。

2.前端调用接口返回:startTime: "2020-03-04T17:53:55.000Z"这样的格式

mysql查看时区为system_javascript


3.但查看数据库,时间显示是正确的格式:

mysql查看时区为system_javascript_02


4. 这个问题其实困扰了我很久,找的方法都一样,但是都解决不了,就一直搁置着,之前都是在搜mysql的时区问题,直到今天多加了个node关键词,才解决掉。论搜索的关键词的重要性!

解决:

1.按照百度的方法先修改了mysql的时区的配置

#登录数据库查看时区配置:
show variables like '%time_zone%';
# 仅修改当前会话的时区,停止会话失效
set time_zone = '+8:00';
 
# 修改全局的时区配置
set global time_zone = '+8:00';
flush privileges;

2.再查看一下,确认已经修改成功了,但是没用,返回的数据还是和修改之前的一样!

mysql查看时区为system_node.js_03


3.这时候还需要修改一下node对数据库的配置(dateStrings : true):

var mysqlConfig = {
  host: "localhost",
  user: "root",
  password: "123456",
  port: "3306",
  database: "sqltest",
  dateStrings: true //修改日期格式 强制日期类型(TIMESTAMP, DATETIME, DATE)以字符串返回
};

module.exports = mysqlConfig

4.再查看一下,格式已经是正确返回了:

mysql查看时区为system_node.js_04


5. 再对比一下,确实,修改配置之前time的格式是红色的,并不是字符串类型;

mysql查看时区为system_mysql_05

附:

附node对mysql的其他配置及解释:

var mysqlConfig = {
host: 连接数据库所在的主机名. (默认: localhost)  
port: 连接端口. (默认: 3306)  
localAddress: 用于TCP连接的IP地址. (可选)  
socketPath: 链接到unix域的路径。在使用host和port时该参数会被忽略.  
user: MySQL用户的用户名.  
password: MySQL用户的密码.  
database: 链接到的数据库名称 (可选).  
charset: 连接的字符集. (默认: 'UTF8_GENERAL_CI'.设置该值要使用大写!)  
timezone: 储存本地时间的时区. (默认: 'local')  
stringifyObjects: 是否序列化对象. See issue #501. (默认: 'false')  
insecureAuth: 是否允许旧的身份验证方法连接到数据库实例. (默认: false)  
typeCast: 确定是否讲column值转换为本地JavaScript类型列值. (默认: true)  
queryFormat: 自定义的查询语句格式化函数.  
supportBigNumbers: 数据库处理大数字(长整型和含小数),时应该启用 (默认: false).  
bigNumberStrings: 启用 supportBigNumbers和bigNumberStrings 并强制这些数字以字符串的方式返回(默认: false).   
dateStrings: 强制日期类型(TIMESTAMP, DATETIME, DATE)以字符串返回,而不是一javascript Date对象返回. (默认: false)  
debug: 是否开启调试. (默认: false)  
multipleStatements: 是否允许在一个query中传递多个查询语句. (Default: false)  
flags: 链接标志. 
}

参考连接:
MySQL查看和修改时区的方法nodejs中mysql用法Nodejs——Mysql时区问题