【发布时间】:2014-06-27 13:51:09
【问题描述】:
当我直接请求 MySQL 时,我以 UTC 形式返回日期(我在 MySQL 服务器中设置了 UTC),但是使用 NodeJS 我得到 UTC+2 本地时区数据,为什么?如何设置 NodeJS 以获取 UTC?
【问题讨论】:
当我直接请求 MySQL 时,我以 UTC 形式返回日期(我在 MySQL 服务器中设置了 UTC),但是使用 NodeJS 我得到 UTC+2 本地时区数据,为什么?如何设置 NodeJS 以获取 UTC?
【问题讨论】:
我知道这个问题已经得到解答,而且很老,但是如果您使用 mysql2 库并且在将时区设置为 UTC 时遇到问题,您可以使用“Z”时区来完成。 Z 代表祖鲁语,explanation from here
const mysql = require('mysql2')
const connection = mysql.createConnection({
host: 'localhost',
user: 'root',
database: 'test',
password: 'mypass',
timezone: 'Z',
})
设置此时区配置意味着每个日期(Javascript 日期对象)在发送到数据库时都将被转换为 utc,而当它来自数据库时,将被转换为 FROM utc。 Here is the implementation, from mysql2 GitHub repository.
【讨论】:
老问题,但可以将 TZ 环境变量设置为“UTC+0”来解决。有几种方法可以实现这一点,其中一些是:
$ TZ='UTC+0' node index.jsprocess.env.TZ = "UTC+0"launch.json 配置文件。例如: {
"type": "node",
"request": "launch",
"name": "Launch Program",
"program": "${fileDirname}/${fileBasename}",
"env": {"TZ": "UTC+0"} // <-- ADD THIS
}
【讨论】:
在一次又一次遇到这个问题后,我找到了想要的解决方案。
我的nodeJS 应用通过Sequelize ORM 从mySQL db 获取数据。
确保时区在所有地方都相同。
config.js:
const timezone = 'UTC'
process.env.TZ = timezone
sequelize_config.js:
const sequelize = new Sequelize(database, user, password,
options: {
host,
dialect: 'mysql',
port,
dialectOptions: {
/* useUTC: true, **deprecated** */
timezone: 'utc'
},
}
}
希望它可以避免某人陷入这种循环...... :)
【讨论】:
尝试将时区值设置为“UTC+0”,这对我有用。
【讨论】:
您还可以将 dateStrings 属性设置为 DATETIME。
dateStrings:强制日期类型(TIMESTAMP、DATETIME、DATE)作为字符串返回,而不是膨胀到 JavaScript Date 对象中。 (默认:假)
【讨论】:
虽然这是一个老问题,但我遇到了类似的问题,添加配置 timezone: 'utc' 并没有解决问题(情况变得更糟)。
我最终使用的解决方案是添加配置dateStrings : true,这样我就有一个原始字符串日期并且mysql模块不会自行转换为javascript日期。
然后我使用 moment.utc(thedatestring) 获取合适的 javascript 对象(在数据库中,我将所有日期保存为 DATETIME 列中的 UTC,与主机的配置无关)。使用Moment.js。
【讨论】:
我在初始化mysql连接时在index.js中添加了时区
var db_config = {
host : 'localhost',
user : 'xxx',
password : '',
database : 'xxx',
timezone: 'utc' //<-here this line was missing
};
【讨论】: