Knex NodeJS 在 PostgreSQL 中插入日期时区兼容

fst*_*stn 0 postgresql timezone node.js knex.js

我有一个像这样的 postgreSQL 表:

table.string('id');
table.string('name');
table.specificType('data', 'JSONB');
table.timestamp('runDate');
table.boolean('done').default(false);
Run Code Online (Sandbox Code Playgroud)

我想知道在数据库中插入日期时间的安全方法是什么。

这就是我所做的:

await _i_.knex("jobs")
    .transacting(ctx ? ctx.transaction : null)
    .insert({
        id: job.id,
        name: job.name,
        data: job.data,
        id: job.id,
        runDate: job.runDate,
        done: false
        });
Run Code Online (Sandbox Code Playgroud)

当我想查询我的表时,我使用:

  return await _i_.knex('jobs')
        .transacting(ctx ? ctx.transaction : null)
        .whereRaw('"runDate" < NOW()')
        .andWhere('done', false)
        .returning("*")
        .update({
            done: true
        });
Run Code Online (Sandbox Code Playgroud)

因此,如果我的 nodeJS 服务器没有比我的 PostgreSQL 保存的时区,我可能会遇到时区问题。

你是怎么做到的?

coo*_*koo 5

默认情况下,为 PostgreSQL 的列knex 创建 timestamp with time zone( timestamptz) 类型.timestamp()。因此,您的日期和时间与时区一起存储。对于插入时间戳值,我喜欢使用moment package

const moment = require('moment');
const dateStr = moment().utc().format();
console.log(dateStr); // => Date in format 'YYYY-MM-DDTHH:mm:ssZ'
knex.insert({ runDate: dateStr })
Run Code Online (Sandbox Code Playgroud)