【问题标题】:Sequelize not returning modified date as UTCSequelize 不将修改日期返回为 UTC
【发布时间】:2018-10-19 09:15:40
【问题描述】:

在我们构建 MySQL 数据库很久之后,我就开始使用 Sequelize。我们有两列,“created”和“modified”,分别存储创建记录的日期和修改记录的时间。

“created”列的类型为“DATETIME”,默认值为“CURRENT_TIMESTAMP”。 “修改”列的类型为“TIMESTAMP”,默认值为“ON UPDATE CURRENT_TIMESTAMP”。 MySQL 使用 UTC 存储日期和时间。

在 Sequelize 中的模型中,我们设置了“timestamps: false”,并配置了“created”和“modified”列,如下所示:

创建:DataTypes.DATE,

修改:DataTypes.DATE

这允许我们在需要时提取创建和修改时间,但让 MySQL 数据库根据默认值记录这些值。

如果我使用 findAll 方法做一个简单的查询,那么在返回的数据中,“created”值将作为 UTC 返回,就像它在数据库中一样。但是,“修改”的值不是数据库中的 UTC,而是两个小时后。我当前的时区比 UTC 早两个小时,而且 Sequelize 似乎认为“修改”列在我的本地时区而不是 UTC。当我们想要根据“修改后的”值开始操作数据时,这会导致巨大的问题。

我可以做些什么来在 Sequelize 中纠正这个问题,或者我必须重新考虑数据库表的配置方式。

【问题讨论】:

  • 您有存储在 SQL 表中的值的示例吗?和 sequelize 返回的值?时区一般应该是显示的问题,但是如果我理解的很好,你的sql列没有存储时区信息?

标签: sequelize.js


【解决方案1】:

如果您使用 UTC,则可能不需要时区。

比如我的mysql服务器是时区'+08:00',

"mysql2": "^1.6.4", “续集”:“^4.41.2”

const sequelize = new Sequelize(database, username, password, {
    host: hostname,
    port: port,
    dialect: 'mysql',
    dialectOptions: {
        typeCast: function (field, next) {
            if (field.type == 'DATETIME' || field.type == 'TIMESTAMP') {
                return new Date(field.string() + 'Z');
            }
            return next();
        }
    },
    operatorsAliases: false,
    pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
    }
});

【讨论】:

  • 更新:您可以升级您的节点包。 eg: "mysql2": "2.0.0", "sequelize": "5.21.2", dialectOptions 不是必须的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2017-09-15
  • 2021-03-19
  • 2011-04-12
  • 2013-10-24
相关资源
最近更新 更多