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

时间:2018-03-23 08:05:10

标签: node.js postgresql timezone knex.js

我有一个像这样的postgreSQL表:

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

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

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

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

你是如何管理的?

2 个答案:

答案 0 :(得分:1)

默认情况下,timestamp with time zone creates timestamptz.timestamp())为PostgreSQL的moment列输入。因此,您的日期和时间与时区一起存储。要插入时间戳值,我想使用const moment = require('moment'); const dateStr = moment().utc().format(); console.log(dateStr); // => Date in format 'YYYY-MM-DDTHH:mm:ssZ' knex.insert({ runDate: dateStr }) package

Function

答案 1 :(得分:0)

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

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

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