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

Knex NodeJS insert date timezone compatible inside PostgreSQL

我有一个像这样的 postgreSQL table:

table.string('id');
table.string('name');
table.specificType('data', 'JSONB');
table.timestamp('runDate');
table.boolean('done').default(false);

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

我就是这样做的:

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
        });

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

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

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

你是怎么做到的?

如何在插入时使用数据库时间:...runDate: knex.raw("NOW()")...

然后存储和检索日期将同步到同一时区。

但是如果 job.runDate 需要毫秒精度,或者记录在存储之前已经保存了很长时间,那么这就不合适了。

默认 knex creates timestamp with time zone (timestamptz) type for .timestamp() columns for PostgreSQL. So, your date and time are stored with timezone. For inserting timestamp values I like to use 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 })