Как получить время в формате ISO со смещением UTC из PostgreSQL?

#postgresql #timezone #sql-timestamp

#postgresql #Часовой пояс #sql-временная метка

Вопрос:

В python я могу получить время для разных часовых поясов в формате ISO следующим образом:

 >>> import datetime
>>> import pytz
>>> datetime.datetime.now(tz=pytz.timezone('America/New_York')).isoformat()
'2019-03-15T04:01:23.919800-04:00'
>>> datetime.datetime.now(tz=pytz.timezone('Asia/Bangkok')).isoformat()
'2019-03-15T15:01:23.919800 07:00'
  

Теперь мне нужно получить временные метки из postgresql в том же формате. После некоторых исследований лучшее, что я придумал, это:

 postgres=# set time zone 'America/New_York';
SET
postgres=# select to_json(now());
      to_json               
------------------------------------
 "2019-03-15T04:32:13.628323-04:00"
  

Возможно ли это сделать без изменения часового пояса сеанса базы данных? Что-то вроде:

 postgres=# select to_json(now() at time zone 'America/New_York') NYC,
postgres-# to_json(now() at time zone 'Asia/Bangkok') Bangkok;
           nyc                |           bangkok         
------------------------------ ------------------------------
 "2019-03-15T04:41:07.789954" | "2019-03-15T15:41:07.789954"
  

в остальном это правильно, но отсутствует смещение UTC.

Ответ №1:

Как насчет этого?

 SELECT current_timestamp AT TIME ZONE 'America/New_York'
       || replace(' ' || to_char(current_timestamp AT TIME ZONE 'America/New_York'
                                 - current_timestamp AT TIME ZONE 'UTC',
                                'HH24:MMFM'),
                  ' -', '-');

             ?column?             
----------------------------------
 2019-03-15 05:43:38.901642-04:00
(1 row)