Перенесите дату и время w. часовой пояс в PostgreSQL для часовой пояс UTC для использования Django 1.4

Нужно ли мне преобразовать все существующее время в Postgres из их текущего часового пояса в UTC или будет определять тайм-зону Django 1.4 при чтении чего-то, что не является UTC (но затем сохранить как UTC).

У меня есть прекрасный и рабочий сайт Django 1.3/Postgres, где я обрабатываю несколько часовых поясов. Я храню все datetime w. информация о часовом поясе, но это, как правило, устанавливается в США/Восточный часовой пояс (да, я знаю, должен был быть UTC) в Postgres.

Теперь я планирую перейти на Django 1.4 и планирую использовать поддержку часового пояса Django. Из того, что я понимаю, он сохранит все datetime в UTC в базе данных, и это прекрасно, но как насчет всей моей существующей информации, где установлен часовой пояс, а не UTC.

Кто-нибудь мигрировал в соответствии с этим и как он работал, чувствует, что либо у меня нет проблем вообще, либо мне нужно перенести множество и много данных datetime.

Ответ 1

Я сохраняю все datetime w. информация о часовом поясе, но это устанавливается в США/восточный часовой пояс (да, я знаю, должен был быть UTC) в Postgres.

Здесь есть несколько неправильных представлений.

Тип данных называется timestamp в PostgreSQL. Нет типа "datetime".
timestamp не подходит для timestamp without time zone.
timestamptz не подходит для timestamp with time zone.

Как говорится в руководстве:

Значения

timestamp сохраняются как секунды до или после полуночи 2000-01-01.

Аналогично времени Posix, которое начинается 30 лет назад на Unix epoch 1970-01-01 00:00 UTC. Для timestamp предполагается локальный 2000-01-01 00:00. Для timestamptz эта ссылка 2000-01-01 00:00 UTC, и значения корректируются для смещения часового пояса на входе и выходе.

timestamp with time zone - это еще один способ ввода и представления уникального момента времени. Вы не можете "установить" временную метку (с часовым поясом или без нее) в любой другой часовой пояс, кроме внутреннего UTC. Сама смещение часового пояса не сохраняется вообще. Он используется только для настройки значения в формате UTC.

Представление значения временной метки учитывает текущий часовой пояс

  • для отображения значения соответственно (выход)
  • для интерпретации timestamp without time zone (ввода).

хорошие новости: ваша миграция должна работать только из коробки - пока вы не будете активно ее испортить.

Я написал подробное объяснение того, как временные метки Postgres работают с примерами и ссылками в этом связанном ответе..


Примеры запросов

Попробуйте выполнить следующие утверждения (по одному блоку за раз). И попробуйте также со своей колонкой:

SHOW timezone;

SELECT '2011-05-24 11:17:11.533479-05'::timestamptz(0);
SELECT '2011-05-24 11:17:11-05'::timestamptz;

SET timezone='UTC';
SELECT '2011-05-24 11:17-05'::timestamptz;

SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC';

SELECT '2011-05-24 11:17-05'::timestamptz AT TIME ZONE 'UTC' AT TIME ZONE 'UTC';

RESET timezone;