【问题标题】:Sequelize mysql reads timezone incorrectly from mysql databaseSequelize mysql 从 mysql 数据库中错误地读取时区
【发布时间】:2022-01-26 19:00:53
【问题描述】:

我在 node.js 应用程序和 mysql 中使用 sequelize 作为数据库,但问题是,当我从 MySQL 表中读取数据时,时区读取不正确。

我想使用 IST(Indian Standard Time) 或 'Asia/Calcutta' 作为读取和写入 MySQL 数据库的时区。

我已经尝试过这个Sequelize reads datetime in UTC only 配置但问题得到了部分解决,即仅用于写入数据库。 但是,它在从数据库读取日期时间时仍然存在。

看,下面的配置更好理解。我还附上了从数据库中读取的不正确时区的屏幕截图。

版本详情: "mysql2": "^2.3.0", “续集”:“^6.6.5”

Mysql 数据库中的表结构:

日期和时间正确的表格数据。

Note: 问题仅在于从数据库中读取 DateTime 而不是用于存储。

Sequelize 模型类:

module.exports = (sequelize, DataTypes) => {
    const Invoice = sequelize.define('Invoice', {
        invoiceId: {
            type: DataTypes.INTEGER.UNSIGNED,
            allowNull: false,
            autoIncrement: true,
            primaryKey: true
        },

        invoiceNumber: {
            type: DataTypes.INTEGER(6).UNSIGNED.ZEROFILL,
            allowNull: false,
            unique: true
        }, 

        description: {
            type: DataTypes.TEXT,
            allowNull: false
        },

        discount: {
            type: DataTypes.DECIMAL(9,2),
            allowNull: false,
            defaultValue: 0.00
        },

        invoiceTotal: {
            type: DataTypes.DECIMAL(9,2),
            allowNull: false,
            defaultValue: 0.00
        },

        paymentTotal: {
            type: DataTypes.DECIMAL(9,2),
            allowNull: false,
            defaultValue: 0.00
        },

        invoiceDate: {
            type: DataTypes.DATE,
            defaultValue: DataTypes.NOW,
            allowNull: false
        }

    }, {
        underscored: true // will add underscore in field name of database instead of storing camel case notation in db
    });

    Invoice.associate = function (model) {
        Invoice.belongsTo(model.Customer, {
            foreignKey: {
                name: "cust_id",
                allowNull: false
            } 
        });
    };

    return Invoice;
}

const sequelize = new Sequelize(
    config.get('db.database'),  // reading from configuration file
    config.get('db.user'), 
    config.get('db.password'), {
        host: config.get('db.host'), 
        dialect: 'mysql',
        dialectOptions: {
            useUTC: false, //for reading from database
            dateStrings: true,
            typeCast: function (field, next) { // for reading from database
            if (field.type === 'DATETIME') {
              return field.string()
            }
            return next()
          },
        },
        timezone: 'Asia/Calcutta'
});

【问题讨论】:

  • 哪个 MySQL 版本?你有populated the database timezones吗? sequelize 使 invoiceDate 列 (show create table Invoice) 成为什么数据类型?
  • 您是否尝试了您链接的问题中发布的所有答案,或者您刚刚尝试了接受的答案?此外,如果您阅读了已接受答案的 cmets,一位用户似乎(可能)有与您类似的问题,其中用户的结论是“将来不要使用 sequelize”......(我不是在暗示你应该放弃尝试通过 sequelize 来实现它)。
  • 我的sequelize模型类中invoiceDate字段的数据类型是DATE,在数据库表中MySQL存储的数据类型是DATETIME。为了帮助您更多,请查看上图数据库中的发票表结构和节点js中的Sequelize Model类。
  • 第二个问题的答案,即我是否填充了数据库时区? - 所以,我不知道这一点。你能帮我详细说明一下吗?
  • @FanoFN,是的,我已经尝试了上面链接的问题中发布的几乎所有答案。甚至,我已经阅读了 cmets 并尝试过。是的,我读到了一个用户关于放弃使用 sequelize 的结论,但是如果我们被困在应用程序的中间,我们怎么能放弃呢? - 相反,我认为找到解决方案是一个更好的选择。

标签: mysql node.js database sequelize.js


【解决方案1】:

令您惊讶的是,我已经回答了这个问题但是这个解决方案还是有一点问题。让我先告诉你这个问题。

Problem: 在我的应用程序中,当我创建新发票时,我继续将其与日期和时间值一起保存在 MySQL 数据库中。但是,我得到的回复是正确的日期但错误的时间。所以,这是我的应用程序中仍然存在的真正问题。而且,这对我来说并不重要,因为我没有显示检索到的响应的日期和时间。你检查你的用例。

Solution: 我的应用程序中有一个用例,我在其中检索所有发票及其日期和时间,在这里我从 MySQL 数据库中获取正确的日期和时间。所以,到目前为止,这对我来说已经足够了。为此检查以下配置。

const sequelize = new Sequelize(
    config.get('db.database'), 
    config.get('db.user'), 
    config.get('db.password'), {
        host: config.get('db.host'),
        dialect: 'mysql',
        define: {
            underscored: true, // use underscore in table name
        },
        dialectOptions: {
            useUTC: false, //for reading from database
            dateStrings: true,
            typeCast: true
        },
        timezone: 'Asia/Calcutta'
});

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多