Sequelize – 为DATE字段使用UNIX时间戳

有没有办法强制Sequelize使用UNIX Timestamp作为默认的时间格式createdAt / updatedAt时间戳自定义的Sequelize.DATE字段types?

谢谢!

PS我正在使用MySQL

在任何时候,有两个可能的date(取决于相对于国际date行的位置):即从UNIX时间戳转换为date需要考虑时区。

例如,UNIX时间戳9466848002000-01-01 00:00:00Z 。 虽然这代表了大西洋东岸几乎所有地方的新千年的第一天,但​​在这片海洋的西边,到处都是千年前夕。 那么它代表哪个date?

虽然可以将date转换为时间戳,但是必须为此定义自己的约定(例如,将给定的date表示为UTC的午夜),否则相同的date可能在每次编码时被不同地表示。 一般来说,这是一个坏主意,可能会有各种意想不到的后果。

有一个DATE数据types存在的原因:这是存储date正确方法。 用它。

没有或至less还没有。 CreatedAt使用utils.now函数在sequelize中设置。 该函数使用JavaScriptdate函数,没有额外的参数。 Squelize可以被修改来改变它调用Date的方式,但是在当前版本中没有代码去做。 看到这里

但是,您可以禁用createdAt和其他时间戳,并使用原始查询来设置您自己的。 但是,你牺牲了sequelize的function。 最好的解决scheme可能是在使用它们之前将这些字段转换为业务逻辑中的unix时间。

虽然eggyal的答案是在MySQL中做事情的正确方法,但是我们中的一些人可能在一个环境或团队中工作,这需要我们使用unix时间戳而不是date时间/时间戳。

我发现一个很好的方法是在sequelize中使用钩子。 在每个模型的底部,您可以添加以下代码:

 { tableName: 'Addresses', hooks : { beforeCreate : (record, options) => { record.dataValues.createdAt = Math.floor(Date.now() / 1000); record.dataValues.updatedAt = Math.floor(Date.now() / 1000); }, beforeUpdate : (record, options) => { record.dataValues.updatedAt = Math.floor(Date.now() / 1000); } } } 

这将插入updatedAtupdatedAt字段作为unix时间戳。