В Postgresql, как отменить смещение часового пояса с помощью «В часовом поясе» - PullRequest
4 голосов
/ 19 августа 2011

Я пытаюсь обернуть голову вокруг часовых поясов Postgresql, и я не могу понять это. EST - это «Стандартное восточное время» в Америке, которое обычно составляет UTC-5 .

.

Пример 1: Базовый тест

select '08/31/2011 12:00 pm EST'::timestamptz  at time zone 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00

Пример 2: смещение + 5

select '08/31/2011 12:00 pm EST' at time zone '+5';
      timezone       
---------------------
 2011-08-31 12:00:00

Пример 3: смещение -5

 select '08/31/2011 12:00 pm EST' at time zone '-5';
      timezone       
---------------------
 2011-08-31 22:00:00

Ясно, что все наоборот. EST снова ... должен быть UTC-5 . Теперь я провел поиск по документации, и она объясняет, что все это «POSIX», , что назад . (Положительное смещение к западу от GMT, а отрицательное смещение к востоку от GMT).

Однако, как мне обойти это? На прикладном уровне я всегда могу поменять знак + на знак -, но это кажется мне беспорядочным. Итак, мой окончательный вопрос.

На уровне базы данных (Postgres) есть ли способ использовать синтаксис «В часовом поясе», чтобы GMT-5 соответствовало EST? Или мне просто нужно инвертировать все на уровне приложений?

1 Ответ

2 голосов
/ 19 августа 2011

Используйте тип данных интервалов, как написано в документации , чтобы получить правильное поведение:

В этих выражениях желаемый часовой пояс zone может быть задан в виде текстовой строки (например, 'PST') или как интервал (например, INTERVAL '-08: 00').

Базовый тест:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE 'EST';
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

Информация о часовом поясе:

SELECT * FROM pg_timezone_abbrevs WHERE abbrev LIKE 'EST';
 abbrev | utc_offset | is_dst 
--------+------------+--------
 EST    | -05:00:00  | f
(1 row)

Правильное смещение -5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '-05:00'::interval;
      timezone       
---------------------
 2011-08-31 12:00:00
(1 row)

Правильное смещение +5:

SELECT '08/31/2011 12:00 pm EST'::timestamptz AT TIME ZONE '+05:00'::interval;
      timezone       
---------------------
 2011-08-31 22:00:00
(1 row) 
...