Как обрабатывать строку как метку времени UTC? - PullRequest
1 голос
/ 08 июня 2019

Мне нужно читать строки типа «20190608070000» как метки времени, указанные в UTC.Есть ли простой способ сделать это?

В этом случае используется UTC, но требуется форматированный ввод:

postgres=# show time zone;
 TimeZone
----------
 CET
(1 Zeile)

postgres=# select timestamp without time zone '2019-06-08 07:00:00' at time zone 'UTC';
        timezone
------------------------
 2019-06-08 09:00:00+02
(1 Zeile)

Принимая во внимание, что to_timestamp () неизменно обрабатывает весь ввод как локальное время, насколько я вижу, поэтому вывод смещается неверно:

postgres=# SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS') AT time zone 'UTC';
      timezone
---------------------
 2019-06-08 05:00:00
(1 Zeile)

На самом деле я использую PostgreSQL 9.6.

1 Ответ

1 голос
/ 08 июня 2019

Тип возврата TO_TIMESTAMP равен timestamp with time zone. Показанное время указано в часовом поясе текущего сеанса (со смещением UTC).

SET SESSION timezone TO 'CET';
SET
knayak=# SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS');
      to_timestamp
------------------------
 2019-06-08 07:00:00+02

Когда вы преобразуете его с помощью AT TIME ZONE, оно покажет время в UTC, когда в текущем часовом поясе 07:00 часов.

SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS') AT time zone 'UTC';
      timezone
---------------------
 2019-06-08 05:00:00
(1 row)

Итак, если вы хотите прочитать вашу метку времени в нужном формате и трактовать ее как UTC, приведите вывод to_timestamp явно к timestamp (без часового пояса) и затем примените AT TIME ZONE.

SELECT to_timestamp('20190608070000', 'YYYYMMDDHH24MISS') :: timestamp 
    AT time zone 'UTC';

        timezone
------------------------
 2019-06-08 09:00:00+02
(1 row)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...