Часовой пояс в летнее время в PostgreSQL

мы развертываем наши собственные датчики потока (много как этот датчик USGS:http://waterdata.usgs.gov/usa/nwis/uv?site_no=03539600) таким образом, мы, байдарки, знаем, достаточно ли воды, чтобы грести поток, и не тратьте время и газ, чтобы ехать туда. Мы надеемся установить несколько из них в юго-восточном регионе Уайтуотер, который охватывает восточные и центральные часовые пояса.

Я сохраняю время вставки записи, используя значение по умолчанию current_time для протокола. Я хотел бы позже отобразить данные, используя MM/DD/YYYY HH12:MI AM TZ формат, который выводит чтение как 03/12/2012 01:00 AM CDT. Я также хотел бы, чтобы выходные данные были в курсе изменений времени экономии дневного света, поэтому последняя часть предыдущего предложения будет меняться между CST и CDT, когда мы "прыгаем вперед" и "отступаем". Это изменение произошло 3/11/2012 в этом году, и я включил даты по обе стороны этой линии DST ниже. Я использую свой ноутбук Windows 7 для разработки, и позже мы будем развертывать в Unix ящик. Postgres, по-видимому, обнаружил, что мой компьютер Windows установлен в Восточный часовой пояс США. Я пробую это с полем "отметка времени без часового пояса" и полем "отметка времени с часовым поясом", но не могу заставить его работать.

Я пробовал использовать "в часовом поясе" в моем выборе, и все работает, пока не придет время отображать часовой пояс. Фактический час является частью отметки времени правильно вычитается на час, когда я спрашиваю время в CDT. Но отображается EDT в выводе.

SELECT reading_time as raw,
       reading_time at time zone 'CDT',
       to_char(reading_time at time zone 'CDT',
           'MM/DD/YYYY HH12:MI AM TZ') as formatted_time
  FROM readings2;

"2012-04-29 17:59:35.65";"2012-04-29 18:59:35.65-04";"04/29/2012 06:59 PM EDT"
"2012-04-29 17:59:40.19";"2012-04-29 18:59:40.19-04";"04/29/2012 06:59 PM EDT"
"2012-03-10 00:00:00";"2012-03-10 00:00:00-05";"03/10/2012 12:00 AM EST"
"2012-03-11 00:00:00";"2012-03-11 00:00:00-05";"03/11/2012 12:00 AM EST"
"2012-03-12 00:00:00";"2012-03-12 01:00:00-04";"03/12/2012 01:00 AM EDT"

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

Спасибо за вашу помощь.

3 ответов


вместо использования имен часовых поясов, таких как CDT или CST, вы можете использовать полные имена часовых поясов в стиле Olsen. В случае Центрального времени, вы можете выбрать часовой пояс. Либо тот, который соответствует вашему местоположению, например America/Chicago, или просто US/Central. Это гарантирует, что PostgreSQL использует базу данных Olsen tz для автоматического определения того, применяется ли летнее время в любой заданной дате.


вы определенно хотите (который также известен как timestamptz в PostgreSQL). Это сохранит метку времени в UTC, так что она представляет определенный момент времени. Вопреки тому, что предполагает название, это не сохранить часовой пояс в столбце ... вы можете просмотреть полученный штамп времени в часовом поясе по вашему выбору с AT TIME ZONE фразы.

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

Я не понимаю ту часть вопроса, которая говорит о хранении метки времени в . Похоже, это часть проблемы. Если вы можете сохранить его в timestamptz С самого начала я подозреваю, что у вас будет меньше проблем. За исключением этого, было бы безопаснее использовать обозначение -04 для смещения от UTC; но это кажется мне больше работы без пользы.


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