Ответ 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;