knex.js 迁移中的时间戳字段

ard*_*von 6 javascript sqlite datetime node.js knex.js

我目前正在使用 knex 为我的数据库 (sqlite3) 编写迁移。我正在制作“用户”表,我希望有两个时间戳字段,created_at以及updated_at. 我希望它们是 notNullable 并在将行插入表时默认添加。我可以使用类似的东西,table.timestamp("created_at).notNullable().defaultTo(knex.fn.now())但在 SQLiteStudio 中它显示为格式化的时间戳 YYYY-MM-DD HH:MM:SS 在 UTC 时区(所以不是我的时区)。所以我有两个问题:

  1. 如何将此日期设置为我的时区?
  2. 是否可以以这种方式在 sqlite 中设置日期时间字段,当我从SELECT语句中获取它时,它会作为 Unix 时间戳(整数)返回,并且在 SQLiteStudio 中仍然显示为格式化日期?

这是我的迁移代码:

exports.up = function(knex, Promise) {
return Promise.all([
    knex.schema.createTable('users', function(table) {
        table.increments("_id").primary().notNullable();
        table.text("login").unique().notNullable();
        table.text("given_name").notNullable();
        table.text("family_name").notNullable();
        table.timestamp("created_at").notNullable().defaultTo(knex.fn.now());
        table.timestamp("updated_at").notNullable().defaultTo(knex.fn.now());
        table.boolean("is_active").notNullable().defaultTo(true);
    }),
]);
};
Run Code Online (Sandbox Code Playgroud)

小智 1

这里应该会给出一些线索。

日期和时间函数

SQLite 支持以下五种日期和时间函数:

date(timestring, modifier, modifier, ...) 
time(timestring, modifier, modifier, ...) 
datetime(timestring, modifier, modifier, ...)
julianday(timestring, modifier, modifier, ...) 
strftime(format, timestring, modifier, modifier, ...)
Run Code Online (Sandbox Code Playgroud)

我相信这个想法是始终将时间存储为 UTC,然后转换为本地时间,strftime()在您想要显示该值时使用。

给出了使用localtime标志 with 的示例:datetime

计算给定 unix 时间戳 1092941466 的日期和时间,并补偿您的本地时区。

SELECT datetime(1092941466, 'unixepoch', 'localtime');
Run Code Online (Sandbox Code Playgroud)

对于人类可读的文本,您需要strftime(). 这有点粗糙,但很有效。我希望这些类型的查询可以从 knex 中实现,我什至从未听说过!