B.2. Обработка недопустимых или неоднозначных временных меток#

B.2. Обработка недопустимых или неоднозначных временных меток

B.2. Обработка недопустимых или неоднозначных временных меток

Обычно, если строка даты/времени синтаксически корректна, но содержит значения полей, выходящие за пределы допустимого диапазона, будет сгенерирована ошибка. Например, ввод, даты 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 утра; часы перешли с 2:00 утра по восточноамериканскому летнему времени (EST) на 3:00 утра по восточноамериканскому летнему времени (EDT). Tantor SE интерпретирует заданное время, как если бы это было стандартное время (UTC-5), что затем отображается как 3:30 утра по восточноамериканскому летнему времени (UTC-4).

Наоборот, рассмотрим поведение во время перехода к резервному варианту:

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

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

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

Точное правило, применяемое в таких случаях, можно сформулировать таким образом: несуществующий момент времени в интервале перехода часов вперёд, привязывается к перемещению относительно UTC, действовавшему в данном часовом поясе до перехода, а неоднозначный момент времени, попадающий в оба интервала при переводе часов назад, привязывается к перемещению относительно UTC, действующему после перехода. Для большинства часовых поясов это равносильно тому, что «предпочтительно использовать интерпретацию стандартного времени, когда возникают сомнения».

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