6

Is there a way to force Sequelize use UNIX Timestamp as default time format both for createdAt/updatedAt timestamps and for custom-defined Sequelize.DATE field types?

Thanks!

P.S. I'm using MySQL

4

3 回答 3

7

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

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

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

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

于 2013-10-05T22:57:41.003 回答
7

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

我发现实现这一点的一个好方法是在 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 时间戳。

于 2017-08-28T15:15:19.540 回答
1

没有或至少还没有。CreatedAt 是在 sequelize 中使用 utils.now 函数设置的。该函数使用没有附加参数的 javascript Date 函数。可以修改 Squelize 以更改它调用 Date 的方式,但在当前版本中没有代码可以做到这一点。看这里

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

于 2013-10-04T19:03:14.507 回答