Sequelize - 对DATE字段使用UNIX时间戳

时间:2013-10-02 14:40:15

标签: mysql node.js sequelize.js

有没有办法强制Sequelize使用UNIX时间戳作为默认时间格式两者用于createdAt / updatedAt时间戳用于自定义Sequelize.DATE字段类型?

谢谢!

P.S。我正在使用MySQL

3 个答案:

答案 0 :(得分:6)

在任何给定的时刻,有两个可能的日期(取决于一个相对于国际日期行的位置):也就是说,从UNIX时间戳转换为日期需要考虑时区。

例如,UNIX时间戳9466848002000-01-01 00:00:00Z。虽然这代表了新千年的第一天,几乎在大西洋以东的所有地方,但它仍然在那个海洋西部的千年前夕。那么它代表哪个日期?

虽然可能从日期转换为时间戳,但必须定义一个自己的约定(例如,将给定日期表示为UTC中的午夜),否则可以表示相同的日期不同的编码方式。一般来说,这是一个坏主意,可能会产生各种意想不到的后果。

存在DATE数据类型的原因:它是 存储日期的正确方法。使用它。

答案 1 :(得分:4)

虽然eggyal的答案是在MySQL中执行操作的正确方法,但我们中的一些人可能在需要我们使用unix时间戳而不是日期时间/时间戳的环境或团队中工作。

我发现完成此任务的一个好方法是在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);
            }
        }
    }

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

答案 2 :(得分:1)

没有,或者至少还没有。 CreatedAt使用sequelize中的utils.now函数设置。该函数使用javascript Date函数而没有其他参数。可以修改Squelize以更改它调用Date的方式,但在当前版本中没有代码可以执行此操作。 见here

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