【发布时间】:2018-11-05 21:12:18
【问题描述】:
我将sequelize 用于节点项目。它连接到一个 Postgres 数据库,其中包含一个带有 DATE 字段的表(与 TIMESTAMP WITH TIMEZONE 不同,DATE 没有时间数据)。
在代码中,我使用 javascript Date 对象对日期进行建模,该对象将时间存储为 UTC 午夜。当我使用 Date 对象将记录插入表中时,sequelize 显然首先将其覆盖到本地时间,因为记录总是落后 1 天。因此,如果我想将 2000-10-31 插入数据库,我最终会得到 2000-10-30。我在 UTC-5。
如何告诉 sequelize 在插入数据库之前不要将日期转换为本地时间?
这里是一些示例代码。如果你想自己运行它,我还创建了一个repository。
var Sequelize = require('sequelize');
const sequelize = new Sequelize('testdb', 'postgres', '???', {
host: 'localhost',
dialect: 'postgres'
});
TestTable = sequelize.define('date_test',
{
id: {
primaryKey: true,
type: Sequelize.INTEGER,
autoIncrement: true
},
someDate: {
field: 'some_date',
type: Sequelize.DATEONLY
}
},
{
timestamps: false,
freezeTableName: true
}
);
// midnight UTC on Halloween ????
var date = new Date(Date.UTC(2000, 9, 31));
// converts to local time resulting in 2000-10-30
TestTable.create({ someDate: date })
.then(function() {
// also apparently converts to local time resulting in 2000-10-30
return TestTable.create({ someDate: date.toUTCString() });
})
.then(function() {
// convert to string, definitely works but seems unnecessary
var strDate = date.getUTCFullYear() + '-' + pad2(date.getUTCMonth() + 1) + '-' + pad2(date.getUTCDate());
return TestTable.create({ someDate: strDate });
})
.then(function() {
// cerate a new local Date, also works but seems hacky
var newDate = new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
return TestTable.create({ someDate: newDate });
})
.then(function() {
process.exit(0);
});
function pad2(n) {
if (n.length === 1) {
return '0' + n;
}
return n;
}
【问题讨论】:
标签: node.js sequelize.js utc