Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PostgreSQL > Вопрос timezone


Автор: evilsoul 13.7.2011, 15:09
Вопрос такой, есть поле timestamptz  со значением "2011-07-13 17:01:20.571133+06"
Скажем мне надо перевести это время в московское
Пытаюсь сделать так timezone('UTC+03:00', dt_field) то получаю "2011-07-13 07:01:20.571133", по идее UTC+3 зона в которой находится Москва
Делаю  timezone('UTC-03:00', dt_field) то получаю московское время "2011-07-13 13:01:20.571133" 

То есть в timestamp зона указывается если на восток то плюс если на запад то минус.
а при получении локального времени в нужной мне часовой зоне указывать зоны наоборот.

Работает, но от меня ускользает логика такого поведения, документации читал, но какого-то внятного объяснения не нашёл.

Хотелось бы разобраться раз и навсегда, как правильно получать локальное время в нужной зоне.

Там можно в принципе указывать синонимы, но они не все работали на часть из них postgres ругался, поэтому хотелось бы указывать просто смещение по времени относительно UTC

Автор: LSD 13.7.2011, 16:04
1. Теперь Москва это UTC+4 smile
2. Попробуй так:
Код

select dt_field at time zone 'UTC+04' from ...

По идее он должен тебе выдать время без указания временной зоны, но по Москве.

Автор: evilsoul 13.7.2011, 22:48
Как я понял по документации функция timezone является синонимом at time zone, во всяком случае отрабатывают они одинаково.
Выдают локальное время. Но проблема в том что указывая зону UTC+3 я получаю время зоны UTC-3, и наоборот.

Вот нашел что-то по теме, пишется по разные форматы задания зоны, 

Цитата

'GMT+3' это идентификатор зоны в формате POSIX, а в идентификаторах зоны по POSIX'у положительное смещение используется для местоположений западней гринвича (наоборот по сравнению с ISO). соответственно, если Вы хотите вводить в формате POSIX — Вам нужно писать GMT-3 в качестве имени зоны.


Вроде как получается, что postgress принимает в формате POSIX, а не ISO. Или это где то настраивается в каком формате он принимает зону.
Если настраивается, то как узнать эту настройку, чтоб я из приложения смог подставлять правильные данные.

В той же документации к постгресу есть таблица с синонимами зон, скажем EAT является синонимом UTC+3  по таблице.
Делаю запрос
Код

select dt, dt at time zone 'EAT' as dt1, dt at time zone 'UTC+3' as dt2 from table


Значения полей dt1 и dt2 различаются, хотя как я понимаю должны быть одинаковые.

Автор: evilsoul 14.7.2011, 20:16
Вообщем по моему я нашел в чем загвоздка, задать зону в  postgres можно тремя способами:
Указав полное название зоны.
Указав ее аббревиатуру.
Указав зону в формате POSIX

А в POSIX, в отличие от ISO, что восточнее нулевого меридиана идет со знаком минус , а западнее со знаком плюс, 
о чем писалось выше.

Всем спасибо за помощь

Автор: LSD 15.7.2011, 10:09
Забавно smile

Автор: bax 29.7.2011, 14:19
не продумано, наверно 
у меня дата приходит в следующем формате "2011-07-29 10:19:35+05"
+05 это +5часов восточнее Гринвича
Возможно, существует набор команд для ввывода  эту дату 
"2011-07-29 10:19:35" (Гринвичевское время) или  "2011-07-29 15:19:35"  (местная) ввиде
А ведь, +5 сам выходит, да пусть и добавить эту разницу . создатели, наверно учитовали этот возможность

Автор: evilsoul 30.7.2011, 07:52
Судя по документации к постгресу timestamp with time zone при выборке возвращает локальное время во временной зоне указанной в конфигурации постгреса, если надо получить время в другой зоне, для этого есть команда at time zone.


Прибавить время не проблема, просто был вопрос почему при вызове at time zone если указываешь алиас временной зоны то все нормально, а если указываешь смещение относительно UTC соответствующее этому алиасу, то на выходе получал не то что ожидал.

Но упорное вкуривание мануалов расставило все по своим местам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)