我在我的应用程序中将Knex查询生成器与Postgres一起使用。我正在尝试在UTC时间中以ISO8016格式的数据在数据库中添加created_atupdated_at字段。我试图让我的数据看起来像这样:

2017-04-20T16:33:56.774Z

在我的Knex迁移中,我尝试同时使用.timestamps()方法和created_at手动创建updated_at.timestamp() 方法并自己命名。

当我为数据库设置种子并将created_atupdated_at设置为等于moment().utc().toISOString()时,但它按以下方式存储在我的数据库中:
2017-04-20 11:20:00.851-05

代码和数据库之间在更改数据之间存在某种关系,我不知道它是Knex,Postgres Node库还是Postgres本身。

最佳答案

Postgres以内部格式存储时间戳,当您读取时间戳时,它将以您请求的格式显示。

knex_test=# update accounts set created_at = '2017-04-20T16:33:56.774Z';                                                                                                                                                                                                                                                  UPDATE 47
knex_test=# select created_at from accounts where id = 3;
         created_at
----------------------------
 2017-04-20 19:33:56.774+03
(1 row)

knex_test=# \d accounts
                                       Table "public.accounts"
   Column   |           Type           |                          Modifiers
------------+--------------------------+-------------------------------------------------------------
 id         | bigint                   | not null default nextval('test_table_one_id_seq'::regclass)
 last_name  | character varying(255)   |
 email      | character varying(255)   |
 logins     | integer                  | default 1
 about      | text                     |
 created_at | timestamp with time zone |
 updated_at | timestamp with time zone |
 phone      | character varying(255)   |
Indexes:
    "test_table_one_pkey" PRIMARY KEY, btree (id)
    "test_table_one_email_unique" UNIQUE CONSTRAINT, btree (email)
    "test_table_one_logins_index" btree (logins)

knex_test=#

您可以更改postgres在哪个时区中返回与您的连接的时间戳
knex_test=# SET timezone = 'UTC';
SET
knex_test=# select created_at from accounts where id = 3;
         created_at
----------------------------
 2017-04-20 16:33:56.774+00
(1 row)

knex_test=#

这是如何使用knex https://github.com/tgriesser/knex/issues/97完成的
var knex = Knex.initialize({
  client: 'pg',
  connection: {
    host     : '127.0.0.1',
    user     : 'your_database_user',
    password : 'your_database_password',
    database : 'myapp_test',
  },
  pool: {
    afterCreate: function(connection, callback) {
      connection.query('SET timezone = timezone;', function(err) {
        callback(err, connection);
      });
    }
 }
});

关于node.js - Knex与Postgres以意外方式存储时间戳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43525321/

10-13 02:47