【问题标题】:Sequelize converts UTC time to wrong local zoneSequelize 将 UTC 时间转换为错误的本地区域
【发布时间】:2020-10-09 13:28:44
【问题描述】:

我有一个表,它在 UTC 区域中存储带有时区的日期时间。它存储在 PostgreSQL 中。表中的数据未转换为任何所需的区域。但是,当我使用findAll 方法查询时,它返回的结果为时区+5 而不是-5(这是正确的服务器区域)。我将默认的useUTC 保留为true,而没有设置truefalse,因为true 是默认值。下面是一个例子:

数据库记录"2020-10-09T03:49:28.652Z"

后续回复"2020-10-09T08:49:28.652Z"

预期回复"2020-10-09T22:49:28.652Z"

我目前正在使用此解决方法。 注意:这是在 ExtJS 6.2 Chart axes renderer function 中运行的。

renderer: function (axis, date_str, layoutContext, lastLabelText) {
   var d = new Date(date_str.replace('Z', '').replace('T', ' ') + ' UTC');
   d.setHours(d.getHours() - 5);
   return Ext.Date.format(new Date(d), 'H:i:s');

我担心 Sequlize 使用用户时区而不是服务器时区。此外,在夏令时期间,此时区可能不正确。

上面的sequelize和render函数有什么好的修复方法吗?

编辑:

我已从日志中添加了 findAll 原始 SQL 查询:

SELECT "id", "capture_datetime", "pco2", "createdAt", "updatedAt" FROM "bos_pco2" AS "bos_pco2" WHERE "bos_pco2"."capture_datetime" IS NOT NULL ORDER BY "bos_pco2"."capture_datetime" DESC LIMIT 30;

捕获 date_time 是一个包含 UTC 日期和时间的 Date 列。 当提供 UTC 日期时间时,另一个原始 SELECT 查询现在可以工作。

这个原始选择查询也不起作用。在 PG Admin 中,我得到了一个结果,但 sequelize 没有结果。

SELECT * FROM bos_chl_a_pc_pe WHERE capture_datetime 
        BETWEEN '2020-10-10T22:41:44.000Z'::TIMESTAMP and '2020-10-11T00:41:44.045Z'::TIMESTAMP 
        ORDER BY capture_datetime; 

【问题讨论】:

    标签: sequelize.js


    【解决方案1】:

    默认情况下,Sequelize 将使用运行它的系统的时区,并将返回的日期转换为该时区格式。如果您想强制 Sequelize 使用 UTC 日期(而不是遵守 DST),那么您需要在创建 Sequelize 连接时指定时区选项。

    const instance = new Sequelize(
      databaseName,
      userName,
      userPassword,
      {
        host: databaseHost,
        dialect: 'postgres',
        // specify to use UTC and the timezone here
        dialectOptions: {
          useUTC: true, // tell the driver you want to use UTC
          timezone: 'Etc/GMT0', // this works for me with mariadb
        },
        timezone: 'Etc/GMT0', // the github issue indicates the TZ here for postgres
      }
    );
    

    有关更多信息,请参阅此 Github 问题:https://github.com/sequelize/sequelize/issues/854

    【讨论】:

    • 不幸的是,当我按原样使用代码时,代码不起作用。我是否需要将第二个时区值更改为Etc/GMT-5
    • @wondim 您正在为客户端设置时区,因此这取决于您希望如何格式化结果。
    • 只要我使用不同的库获得未修改的 UTC,就可以将 UTC 转换为本地。问题是,尚不清楚续集期待和返回的内容。例如,当我在两次之间查询数据时,PgAdmin 返回几条记录,但 sequelize 返回 0。这意味着它仍在转换范围之间的时间戳。那是我的问题。我不希望 sequelize 将日期更改为任何格式。
    • @wondim 您可能还需要包含您的查询 - 您确定条件创建正确吗?
    • 我在Edit 下的问题中添加了一个仍然无法解决问题的查询。现在可以在日期之间进行选择。
    猜你喜欢
    • 2019-05-31
    • 2014-10-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2019-03-09
    • 1970-01-01
    • 2018-04-17
    • 1970-01-01
    相关资源
    最近更新 更多