B.5. Спецификации временных зон POSIX#

B.5. Спецификации временных зон POSIX

B.5. Спецификации временных зон POSIX

Tantor SE может принимать спецификации часовых поясов, написанные в соответствии с правилами стандарта POSIX для переменной окружения TZ. Спецификации часовых поясов стандарта POSIX недостаточны для работы с сложной историей часовых поясов в реальном мире, но иногда целесообразно использовать их.

Спецификация часового пояса POSIX имеет следующую форму

STD offset [ DST [ dstoffset ] [ , rule ] ]

(Для удобочитаемости мы показываем пробелы между полями, но на практике пробелы не должны использоваться). Поля:

  • STD - это сокращение зоны, которое будет использоваться для стандартного времени.

  • offset - это стандартное смещение времени зоны относительно UTC.

  • DST - это сокращение зоны, которое будет использоваться для перехода на летнее время. Если это поле и следующие не указаны, зона использует фиксированное смещение относительно UTC без правила перехода на летнее время.

  • dstoffset - это смещение для перехода на летнее время относительно UTC. Обычно это поле опускается, так как оно по умолчанию равно одному часу меньше стандартного смещения времени (offset), что обычно является правильным.

  • Правило rule определяет правило для перехода на летнее время, как описано ниже.

В этом синтаксисе аббревиатура зоны может быть строкой из букв, такой как EST, или произвольной строкой, окруженной угловыми скобками, такой как <UTC-05>. Обратите внимание, что здесь указанные аббревиатуры зон используются только для вывода, и даже тогда только в некоторых форматах вывода временных меток. Аббревиатуры зон, распознаваемые при вводе временных меток, определяются, как объясняется в разделе Раздел B.4.

Поля смещения указывают часы, а также, при необходимости, минуты и секунды, разницу относительно UTC. Они имеют формат hh [:mm[:ss]] опционально с начальным знаком (+ или -). Положительный знак используется для зон западнее Гринвича. (Обратите внимание, что это противоположно соглашению о знаке ISO-8601, используемому в других местах в Tantor SE). hh может иметь одну или две цифры; mm и ss (если используются) должны иметь две.

Переход на летнее время имеет формат rule

dstdate [ / dsttime ] , stddate [ / stdtime ]

(Как и раньше, пробелы на практике не должны включаться). Поля dstdate и dsttime определяют, когда начинается переход на летнее время, в то время как stddate и stdtime определяют, когда начинается стандартное время. (В некоторых случаях, особенно в зонах к югу от экватора, первое может быть позже в году, чем второе). Поля даты имеют один из следующих форматов:

n

Целое число обозначает день года, считая от нуля до 364 или до 365 в високосные годы.

Jn

В этой форме n считается от 1 до 365, и 29 февраля не учитывается, даже если он присутствует. (Таким образом, переход, происходящий 29 февраля, не может быть указан таким образом. Однако дни после февраля имеют одинаковые номера, независимо от того, является ли год високосным или нет, поэтому эта форма обычно более полезна, чем простая целочисленная форма для переходов на фиксированные даты).

Mm.n.d

Эта форма указывает на переход, который всегда происходит в тот же месяц и в тот же день недели. m определяет месяц от 1 до 12. n указывает n-е вхождение дня недели, определенного d. n - это число от 1 до 4 или 5, что означает последнее вхождение этого дня недели в месяце (которое может быть четвертым или пятым). d - это число от 0 до 6, где 0 указывает на воскресенье. Например, M3.2.0 означает второе воскресенье в марте.

Примечание

Формат M достаточен для описания многих распространенных законов перехода на летнее время. Однако следует отметить, что ни одна из этих вариаций не может справиться с изменениями законов перехода на летнее время, поэтому на практике для правильной интерпретации прошлых временных меток необходимы исторические данные, хранящиеся для именованных часовых поясов (в базе данных часовых поясов IANA).

Временные поля в правиле перехода имеют тот же формат, что и ранее описанные поля смещения, за исключением того, что они не могут содержать знаки. Они определяют текущее местное время, при котором происходит изменение на другое время. Если они не указаны, они по умолчанию устанавливаются на 02:00:00.

Если указано сокращение для перехода на летнее время, но поле rule не указано, то fallback-поведение заключается в использовании правила M3.2.0,M11.1.0, которое соответствует практике в США на 2020 год (то есть перевод стрелок вперед на второе воскресенье марта, перевод стрелок назад на первое воскресенье ноября, оба перехода происходят в 2 часа утра по местному времени). Обратите внимание, что это правило не дает правильные даты перехода в США для лет до 2007 года.

Как пример, CET-1CEST,M3.5.0,M10.5.0/3 описывает текущую (на 2020 год) практику отсчета времени в Париже. Эта спецификация говорит о том, что стандартное время имеет аббревиатуру CET и находится на один час вперед (на восток) от UTC; летнее время имеет аббревиатуру CEST и неявно находится на два часа вперед от UTC; переход на летнее время происходит в последнее воскресенье марта в 2 часа ночи по CET, а переход на стандартное время происходит в последнее воскресенье октября в 3 часа ночи по CEST.

Четыре имена часовых поясов EST5EDT, CST6CDT, MST7MDT, и PST8PDT выглядят как спецификации POSIX-зон. Однако, на самом деле они рассматриваются как именованные часовые пояса, потому что (по историческим причинам) в базе данных часовых поясов IANA есть файлы с такими именами. Практическое следствие этого заключается в том, что эти имена зон будут создавать действительные исторические переходы на летнее время в США, даже когда обычная спецификация POSIX этого не делает.

Однако следует быть осторожным, так как легко допустить опечатку в спецификации временной зоны в стиле POSIX, поскольку нет проверки на разумность сокращений зоны. Например, SET TIMEZONE TO FOOBAR0 будет работать, что приведет к использованию системой довольно странного сокращения для UTC.