Перейти к основному содержимому

Обработка недействительных или нечетких временных меток

примечание

Эта страница переведена при помощи нейросети GigaChat.

Обычно, если строка даты/времени синтаксически допустима, но содержит значения полей вне диапазона, возникает ошибка. Например, ввод, указывающий на 31 февраля, будет отклонен.

Во время перехода на летнее время возможно, что, казалось бы, допустимая строка временной метки представляет несуществующую или неоднозначную временную метку. Такие случаи не отвергаются, неопределенность разрешается путем определения того, какой сдвиг UTC следует применить. Например, предположим, что параметр TimeZone установлен на America/New_York, рассмотрим

=> SELECT '2018-03-11 02:30'::timestamptz;
timestamptz
------------------------
2018-03-11 03:30:00-04
(1 row)

Поскольку в тот день в данном часовом поясе произошел переход на летнее время (весенний перевод часов), гражданского (официального) времени 2:30 AM не существовало; часы перескочили с 2:00 AM EST (UTC-5) сразу на 3:00 AM EDT (UTC-4). PostgreSQL интерпретирует указанное время так, как если бы оно относилось к стандартному времени (UTC-5), которое затем отображается как 3:30 AM EDT (UTC-4).

И наоборот, рассмотрим поведение во время осеннего перевода часов:

=> SELECT '2018-11-04 01:30'::timestamptz;
timestamptz
------------------------
2018-11-04 01:30:00-05
(1 row)

В эту дату существовало два возможных варианта интерпретации времени 1:30 AM: сначала было 1:30 AM EDT (летнее время, UTC-4), а затем, спустя час, после того как часы перевели назад с 2:00 AM EDT на 1:00 AM EST (стандартное время, UTC-5), появилось еще одно 1:30 AM EST.

PostgreSQL снова интерпретирует указанное время как стандартное (UTC-5). Однако можно явно указать, что время следует трактовать как летнее (EDT):

=> SELECT '2018-11-04 01:30 EDT'::timestamptz;
timestamptz
------------------------
2018-11-04 01:30:00-04
(1 row)

Точное правило, применяемое в таких случаях, заключается в следующем:

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

В большинстве часовых поясов это эквивалентно утверждению, что «при неоднозначности предпочтение отдается стандартному времени».

Во всех случаях UTC-смещение для временной метки может быть задано явно — либо числовым смещением UTC, либо аббревиатурой часового пояса с фиксированным смещением. Приведенное выше правило применяется только тогда, когда необходимо определить UTC-смещение для часового пояса, где это смещение меняется.