【问题标题】:Sequelize Date returning wrong date (minus 1)Sequelize Date 返回错误的日期(减 1)
【发布时间】:2017-02-16 06:16:33
【问题描述】:

我的一个表有一个名为生日的字段,其数据类型为日期,但是当我尝试通过 Express 应用程序导出数据时,它会将日期更改为比应有的日期小一。例如,当我将其导出为 1978 年 6 月 19 日时,生日确实是 1978 年 6 月 20 日。

我在注销数据时注意到的一些事情是,即使它是一个仅限日期的字段(续集?)正在向它添加时间戳。因此,如果我不对日期进行任何格式化(我需要这样做),那么日期将是正确的,但对于我们的导出来说是不可读的。

当我从开发笔记本运行应用程序时,一切正常,但当我推送到 QA 时,它返回错误的日期。

如果我从笔记本(位于太平洋时区)打开 PG3Admin 以查询 QA/生产服务器(位于夏威夷时区)上的数据,则数据看起来正确。

我正在使用 Sequelize v3.4.1 连接到 Postgres 9.3 数据库。同样在我的 Sequelize 配置文件中,我设置了 "timezone": "-10:00" 选项。

【问题讨论】:

  • 建议您使用UTC将日期存储在数据库中,并且只设置显示时区
  • Sequelize 社区似乎不建议这样做。奇怪的部分是在数据库中它只存储没有时间的日期。
  • 请检查this answer

标签: javascript express sequelize.js


【解决方案1】:

sequelize 最好用数据类型 DATEONLY 存储,时间戳使用 DATE

根据github source

_applyTimezone(date, options) {
  if (options.timezone) {
    if (momentTz.tz.zone(options.timezone)) {
      return momentTz(date).tz(options.timezone);
    }
    return (date = moment(date).utcOffset(options.timezone)); <-- this will convert your date to UTC
  }
  return momentTz(date);
}

您需要在 sequelize 配置中定义您的时区,以防生日最好使用 DATEONLY 数据类型

所以你的模型可以像

birthday: {
  type: DataTypes.DATEONLY
},
createdAt: {
  type: DataTypes.DATE
},
updatedAt: {
  type: DataTypes.DATE
}

所有数据类型都可以在doc中看到

【讨论】:

  • 请在此处添加示例,而不是链接到外部文档。虽然外部文档现在可能包含答案,但它可以随时更改,使您的答案毫无价值
【解决方案2】:

我不知道这是否是最好的解决方案,但它对我有用:

Sequelize.YOURDIALECT.DATEONLY.parse = function(value) {
    return moment(moment(value).format('YYYY-MM-DD'), "YYYY-MM-DD").add(1, 'days');
};

希望这对其他人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2021-11-13
    相关资源
    最近更新 更多