Sequelize – 为DATE字段使用UNIX时间戳
有没有办法强制Sequelize使用UNIX Timestamp作为默认的时间格式createdAt / updatedAt时间戳和自定义的Sequelize.DATE字段types?
谢谢!
PS我正在使用MySQL
在任何时候,有两个可能的date(取决于相对于国际date行的位置):即从UNIX时间戳转换为date需要考虑时区。
例如,UNIX时间戳946684800
是2000-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); } } }
这将插入updatedAt
和updatedAt
字段作为unix时间戳。