【问题标题】:Sequelize reads datetime in UTC onlySequelize 仅以 UTC 格式读取日期时间
【发布时间】:2018-05-02 05:57:42
【问题描述】:

我已将timezone 选项设置为我的时区(Europe/Zagreb 并且我也尝试过使用+02:00),并且时间按应有的方式保存,但是,当从数据库中读取时间时, Sequelize 将其转换为 UTC。我也尝试过不同的时区,每个时区都正确保存,但从数据库读取时总是转换为 UTC。

是我做错了什么还是这是一个已知问题,是否有任何解决方法?

我创建了一个新的连接:

sequelize = new Sequelize(config.database, config.username, config.password, config);

我的配置看起来像这样:

"development": {
    "username": "root",
    "password": "root",
    "database": "db",
    "host": "localhost",
    "dialect": "mysql",
    "timezone": "Europe/Zagreb"
}

【问题讨论】:

    标签: mysql datetime timezone sequelize.js utc


    【解决方案1】:

    你可以试试这个对我有用的选项:

    const sequelize = new Sequelize(database, username, password, {
      host: hostname,
      port: port,
      dialect: 'mysql',
      dialectOptions: {
        encrypt: false,
        options: {
          useUTC: false, // for reading from database
        },
      },
      operatorsAliases: false,
      pool: {
        max: 5,
        min: 0,
        acquire: 30000,
        idle: 10000
      }
    });
    

    【讨论】:

      【解决方案2】:

      你可以试试这段代码,我遇到了同样的问题,这对我有用。

      const sequelize = new Sequelize(mysql.database, mysql.user, mysql.password, {
          host: mysql.host,
          port:3306,
          dialect:'mysql',
          define: {
            underscored: true,
            freezeTableName: true, //use singular table name
            timestamps: false,  // I do not want timestamp fields by default
          },
          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: '+01:00'
      });
      

      【讨论】:

      • 谢谢,dialectOptions 中的 typeCast 函数在我的情况下起到了作用。
      • 我无法使用此方法。 Sequelize 在插入和读取数据时仍然使用 UTC。它只能在本地工作,但当我将我的应用程序上传到我的服务器时不能。我的服务器设置为使用我的时区,而 MySQL 服务器设置为使用系统时区。关于为什么这不起作用的任何想法?
      • @user3183411 timezone : '+01:00' // use your timezone here 用于写入数据库,检查它是否在 dateTime 字段中写入正确的值,如果写入正确的值则只需使用 typeCast 函数dialectOptions.
      • 如果没有写入正确的值怎么办?我已将时区设置为使用 timezone: '-07:00' 甚至 America/Boise。这些都不起作用。
      • 我理解这个概念,这就是为什么我试图解决为什么不正确的时区被写入数据库的问题。好像我的配置被sequelize忽略了。在这一点上,我将保持原样,以后不再使用 sequelize。
      【解决方案3】:

      如果您使用 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
          }
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-06-02
        • 2019-07-27
        • 2023-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-11
        • 1970-01-01
        相关资源
        最近更新 更多