2012-04-13 5 views
2

Я использую postgresql для хранения некоторых дат в базе данных.
В моем приложении фундаментально, что он полностью осведомлен о часовых поясах, и я проводил базовые тесты между клиентом, сервером и базой данных.PostgreSQL 9.1 timezones

Я отправляю даты из приложения браузера, которое я сделал в GWT, и читал даты на postgresql.

Мои тесты:

Клиент всегда находится в часовом поясе, и я всегда посылающие ту же дату для каждого конкретного случая.
13.04.2012 00:00:00 GMT + 00

На posgres я изменяющийся часовые пояса для каждого теста. Между тестами я удаляю все даты из таблицы.

Чтобы изменить часовой пояс на posgres, я делаю это на {PostgreSQL HOME} \ 9.1 \ data \ postgresql.conf, устанавливая timezene на тот, который я хочу.

Тесты: Клиент: 13.04.2012 00:00:00 GMT + 00

первый тест - posgres EST - 12.04.2012 19: 00: 00-05 Согласно postgresql documentation EST = GMT - 5
второго теста - posgres GMT + 5 - 12.04.2012 19: 00: 00-05
третьего теста - posgres GMT - 5 - 13.04.2012 05: 00: 00 + 05

Теперь мой вопрос поднимается: согласно документам, EST = GMT - 5. Так почему я читаю его наоборот? Я что-то упустил?

EDIT Технические аспекты моих тестов:
На клиенте я посылаю этот: 2012 Апрель 13 00:00:00 GMT + 00.
На сервере я использую JDBC, чтобы писать на дб:
новообращенный java.utils.date в java.sql.Timestamp

java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp(date.getTime());
(дата java.utils.Date, что исходит от клиента)

установить подготовленное заявление
PreparedStatement ps = con.prepareStatement("INSERT INTO teste.dates (dates_tz, dates_ntz) VALUES (?, ?);"

ps.setTimestamp (1, sqlTimeStamp); ...

Для записи, это как раз то, что я хочу, чтобы понять, потому что в целом это хорошо работает для моих целей ..

+1

Просьба показать фактические утверждения, используемые в ваших тестах. –

+0

На клиенте я отправляю это: 2012 13 апреля 00:00:00. На сервере, использующем JDBC для записи на db: java.sql.Timestamp sqlTimeStamp = new java.sql.Timestamp (date.getTime()); (дата java.utils.Date, которая поступает от клиента) INSERT INTO dbFoo.dates_table (date_tz) VALUES (?); ps.setTimestamp (1, sqlTimeStamp); –

+0

Измените свой вопрос вместо того, чтобы помещать информацию в комментарии. Это гораздо легче читать. –

ответ

11

warning in the documentation Считают, что:

Другой вопрос, чтобы иметь в виду, что в именах POSIX часовых поясов, положительные сдвиги используются для расположения к западу от Гринвича. Везде еще, PostgreSQL следует за соглашением ISO-8601, что положительные смещения часовых поясов находятся к востоку от Гринвича.

Похоже, что противоположные знаки в направлении GMT, которые вы видите, являются именно результатом этого расхождения. Часовой пояс, указанный в postgresql.conf, вероятно, интерпретируется с помощью правил POSIX, но позже он отображается SQL с правилами ISO-8601 (тот, который действительно используется).

+0

+1 - хороший улов. –

+0

Спасибо! Это ответило на мои сомнения. :) –

+1

Это то, что меня смутило с последних двух часов. Разве нет хорошего решения для этого? Спасибо за объяснение! – virtualmic

1

Когда часы на стене показывает 2012-04-13 00:00 в часовом поясе «+5» , время в Лондоне (GMT или UTC) составляет 2012-04-12 19:00.

Если вы проживаете в США, то ваш часовой пояс может быть «-5». Когда там полночь, это 05:00 утром в Лондоне.

Вот как это. Этот подробный ответ о handling of time zones in PostgreSQL может помочь вам разобраться.

+0

Я это знаю. Дело в том, что GMT-5 точно такой же, как EST, согласно документам. А на позыре это показывает противоположное .EST равно GMT + 5. –