续订日期返回错误的日期(减1)

时间:2016-10-07 09:32:25

标签: javascript express sequelize.js

我的一个表中有一个名为birthdate的字段,其数据类型为Date,但当我尝试通过Express应用程序导出数据时,它会将日期更改为比应该更少的日期。例如,出生日期真的是6月20日,当我出口它变成6/19/1978。

我注意到我在注销数据时注意到了一些东西,即使它只是一个Date日期字段(Sequelize?)正在添加时间戳。因此,如果我没有对日期进行任何格式化(我需要),那么日期将是正确的,但对我们的出口不可读。

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

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

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

2 个答案:

答案 0 :(得分:0)

最好将数据类型为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);
}

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

因此您的模型可以像

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

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

答案 1 :(得分:-1)

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

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

希望这对其他人有帮助。