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

Posted

技术标签:

【中文标题】当我直接从 MySQL 获取时,NodeJS 响应 MySQL 时区不同【英文标题】:NodeJS responded MySQL timezone is different when I fetch directly from MySQL 【发布时间】:2014-06-27 13:51:09 【问题描述】:

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

【问题讨论】:

【参考方案1】:

我知道这个问题已经得到解答,而且很老,但是如果您使用 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.

【讨论】:

【参考方案2】:

老问题,但可以将 TZ 环境变量设置为“UTC+0”来解决。有几种方法可以实现这一点,其中一些是:

在 bash 中: $ TZ='UTC+0' node index.js 代码内部: process.env.TZ = "UTC+0" 在 Visual Code 中更改 launch.json 配置文件。例如:
    
        "type": "node",
        "request": "launch",
        "name": "Launch Program",
        "program": "$fileDirname/$fileBasename",
        "env": "TZ": "UTC+0"  // <-- ADD THIS
    

【讨论】:

【参考方案3】:

在一次又一次遇到这个问题后,我找到了想要的解决方案。

我的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'
    ,
  

希望它可以避免某人陷入这种循环...... :)

【讨论】:

【参考方案4】:

尝试将时区值设置为“UTC+0”,这对我有用。

【讨论】:

太棒了。也为我工作。谢谢。【参考方案5】:

您还可以将 dateStrings 属性设置为 DATETIME。

dateStrings:强制日期类型(TIMESTAMP、DATETIME、DATE)作为字符串返回,而不是膨胀到 JavaScript Date 对象中。 (默认:假)

参考:https://github.com/mysqljs/mysql#connection-options

【讨论】:

【参考方案6】:

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

我最终使用的解决方案是添加配置dateStrings : true,这样我就有一个原始字符串日期并且mysql模块不会自行转换为javascript日期。

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

【讨论】:

【参考方案7】:

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

var db_config = 
  host     : 'localhost',
  user     : 'xxx',
  password : '',
  database : 'xxx',
  timezone: 'utc'  //<-here this line was missing
;

【讨论】:

不幸的是,这并不能解决我的问题,还有其他答案吗? 基于实际文档:'timezone' 可以是 'local'、'Z' 或 +HH:MM 或 -HH:MM 形式的偏移量。 (github.com/mysqljs/mysql#connection-options) 但在我的情况下,这也不能解决问题(设置为“Z”) 感谢您的回答!在这里修复了我的问题!

以上是关于当我直接从 MySQL 获取时,NodeJS 响应 MySQL 时区不同的主要内容,如果未能解决你的问题,请参考以下文章

nodeJS:获取响应未在浏览器中打开-说页面不起作用

使用 Jquery 从 REST API nodeJS 获取数据 [重复]

从 Nodejs 中的 mySQL 获取数据时如何从 Async/await 函数获取返回值

如何从 Nodejs Mysql 获取 JSON 类型作为 JSON 而不是 String

没有从另一个 Nodejs 服务器获得响应?

nodejs从MySQL数据中获取的时间,展示时与存储时间相差8小时的解决方法