当我直接从MySQL获取时,NodeJS响应MySQL时区是不同的

Ján*_*nos 12 mysql timezone node.js

当我直接请求MySQL时,我以UTC格式返回日期(我在MySQL服务器中设置UTC),但是使用NodeJS我得到UTC + 2本地时区数据,为什么?如何设置NodeJS以获得UTC?

在此输入图像描述 在此输入图像描述

Ján*_*nos 51

我在初始化mysql连接时在index.js中添加了时区

var db_config = {
  host     : 'localhost',
  user     : 'xxx',
  password : '',
  database : 'xxx',
  timezone: 'utc'  //<-here this line was missing
};
Run Code Online (Sandbox Code Playgroud)

  • 根据实际文档:“时区”可以是“本地”、“Z”或 +HH:MM 或 -HH:MM 形式的偏移量。(https://github.com/mysqljs/mysql#connection-options)但就我而言,这也不能解决问题(设置“Z”) (3认同)

Azi*_*ias 8

虽然这是一个老问题,但我遇到了类似的问题并且添加配置timezone: 'utc'并没有解决问题(它变得更糟).

我最终使用的解决方案是添加配置dateStrings : true,以便我有一个原始字符串日期和mysql模块不会自己转换为javascript日期.

然后我使用moment.utc(thedatestring)来获取合适的javascript对象(在数据库中,我将所有日期保存为DATETIME列中的UTC,与主机的配置无关).使用Moment.js.


Mar*_*los 6

我知道这个问题已经得到解答,而且很旧,但是如果您使用 mysql2 库并且在将时区设置为 UTC 时遇到问题,您可以使用“Z”时区来完成。Z代表祖鲁语,解释来自这里

const mysql = require('mysql2')
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  database: 'test',
  password: 'mypass',
  timezone: 'Z',
})
Run Code Online (Sandbox Code Playgroud)

设置此时区配置意味着每个日期(Javascript Date 对象)在发送到数据库时将被转换为 utc,而在来自数据库时将被转换为 FROM utc。这是来自 mysql2 GitHub 存储库的实现


Dav*_*idA 5

在一次又一次陷入这个问题之后,我找到了所需的解决方案。

我的应用程序通过 ORM 从数据库nodeJS获取数据。mySQLSequelize

确保各地时区相同。

config.js:

const timezone = 'UTC'
process.env.TZ = timezone
Run Code Online (Sandbox Code Playgroud)

sequelize_config.js:

const sequelize = new Sequelize(database, user, password, 
  options: {
    host,
    dialect: 'mysql',
    port,

    dialectOptions: {
       /* useUTC: true, **deprecated** */ 
       timezone: 'utc'
    },
  }
}
Run Code Online (Sandbox Code Playgroud)

希望它能节省某人的时间,避免陷入这个循环......:)