Проблемът изглежда несвързан с Amazon RDS:той е свързан с конвенцията, използвана от PostgreSQL. В този случай вие правите имат името на часовата зона наопаки. Имате предвид 'UTC-01'
където пишете .'UTC+01'
От ръководството :
Така че низът за часова зона, използван за SET TIME ZONE
(и показването на SHOW timezone
, съответно) или AT TIME ZONE
конструкция използвайте противоположния знак от това, което се показва в timestamp
(with time zone
) литерали! Това е много жалко несъгласие между стандарта ISO и SQL, от една страна, и POSIX, от друга. (Мисля, че POSIX е виновен.) Вижте:
Но 'CET'
или 'UTC-01'
и двете все още са потенциално грешни за Париж, защото не спазват правила за лятно часово време предвид.
(Лятното часово време е една от най-идиотските концепции в историята на човечеството.)
Париж (както по-голямата част от Европа) използва CET през зимата и CEST през лятото. Вашите тестове с 'CET'
случайно работи през ноември. Ако опитате същото през лятото, ще получите грешен резултат.
За по-голяма сигурност винаги използвайте името на часовата зона 'Europe/Paris'
, който разглежда правилата за DST. Обаждането е по-скъпо.
Функцията current_time
взема под внимание правилата за DST, ако настройката ви за часова зона предполага такива. Но 'UTC-01'
е обикновен офсет във времето. Никога не използвам типа данни time with time zone
или current_time
да започнем с. Ръководството още веднъж:
Помислете за следното:
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC+01' AS plus_wrong
, '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'UTC-01' AS minus_right
SELECT '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_winter
, '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CEST' AS cest_summer
, '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'CET' AS cet_no_dst -- CET wrong!
SELECT '2016-06-06 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_summer
, '2016-01-01 00:00+0'::timestamptz AT TIME ZONE 'Europe/Paris' AS paris_winter
Свързани: