TZFILE(5)

ИМЯ
tzfile - информация о часовом поясе

ОПИСАНИЕ
В данной странице описана структура файлов часовых поясов, которые используют функцией tzset(3). Обычно, эти файлы можно найти в каталоге /usr/lib/zoneinfo или /usr/share/zoneinfo. Файлы с информацией о часовом поясе начинаются с 44-байтового заголовка, содержащего следующие данные:

*   Магическая четырехбайтовая последовательность "TZif", означающая, что это файл с информацией о часовом поясе.

*   Один символ, указывающий на версию формата файла: это может быть либо ASCII NUL ('\0'), либо '2' (0x32).

*   Пятнадцать байт, заполненные нулями, зарезервированные для будущего использования.

*   Шесть четырехбайтовых значений типа long, записанных в "стандартном" порядке байт (старший байт значения записывается первым). Этими значениями являются, по порядку:

    tzh_ttisgmtcnt
        Количество UTC/локальных (local) индикаторов в файле

    tzh_ttisstdcnt
        Количество стандартных/местных (wall) индикаторов в файле

    tzh_leapcnt
        Количество високосных секунд, определённых в файле

    tzh_timecnt
        Количество "момент перевода часов", определённых в файле

    tzh_typecnt
        Количество "типов локального времени", определённых в файле (не должно быть равно 0).

    tzh_charcnt
        Количество символов "строк аббревиатур часовых поясов", определённых в файле

За заголовком следуют четырехбайтные значения tzh_timecnt типа long, расположенные в порядке возрастания. Эти значения записаны "стандартным" порядком байт. Каждое из этих значений используется как момент перевода часов (в формате, возвращаемом функцией time(2)), при задании которого изменяются правила вычисления локального времени. После этого следуют однобайтные значения tzh_timecnt типа unsigned char; каждое из этих значений указывает, какому типу "локального времени", описанному в файле, соответствует момент перевод часов с тем же индексом. Эти значения выступают в роли индексов массива структур ttinfo (с элементами tzh_typecnt), который находится в файле после этих значений. Структура определена так:

struct ttinfo {
    long         tt_gmtoff;
    int          tt_isdst;
    unsigned int tt_abbrind;
};

Каждая структура состоит из четырехбайтного значения tt_gmtoff типа long, записанного "стандартным" порядком байт; за этим значением следует однобайтное значение tt_isdst и однобайтное значение tt_abbrind. В каждой структуре tt_gmtoff означает, сколько секунда надо добавить к UTC, tt_isdst определяет, будет ли tm_isdst устанавливаться localtime(3), и tt_abbrind является индексом массива аббревиатур часовых поясов; массив следует за структурами ttinfo.

После этого массива находятся пары четырехбайтных значений tzh_leapcnt, записанные "стандартным" порядком байт; первое значение каждой пары задает время (в формате time(2)) високосной секунды; вторая пара определяет общее количество високосных секунд, добавляемых к указанному моменту времени. Пары значений располагаются в порядке возрастания.

Затем в файле располагаются индикаторы стандартного/местного времени tzh_ttisstdcnt, каждый хранится в виде однобайтного значения; эти индикаторы определяют, как связаны моменты перевода часов с локальными типами времени: согласно стандартному или местному времени. Эти индикаторы используются, когда файл с информацией о часовых поясах работает с POSIX-совместимыми переменными окружения часовых поясов.

И наконец, в этом файле находятся UTC/локальные индикаторы tzh_ttisgmtcnt, каждый хранится в виде однобайтного значения; эти индикаторы определяют, как связаны моменты перевода часов с локальными типами времени: согласно UTC или локальному времени. Эти индикаторы используются, когда файл с информацией о часовых поясах работает с POSIX-совместимыми переменными окружения часовых поясов.

Функция localtime(3) использует первую структуру стандартного стандартного времени ttinfo из этого файла (или просто первую структуру ttinfo при отсутствии структуры стандартного времени), если значение tzh_timecnt равно нулю или аргумент времени меньше первого момента перевода часов, записанного в файле.

  Формат версии 2
Для файлов с информацией о часовых поясах версии 2, вышеприведённый заголовок и данные, идущие за вторым заголовком и данными, идентичны по формату, за исключением того, что для каждого перевода времени или високосной секунды используется 8 байт (а также указана версия 0x32 вместо 0x00 в заголовке). После второго заголовка и данных следует закрывающий символ новой строки, строка в формате переменной TZ из окружения POSIX для обработки моментов после последнего перевода времени, хранящегося в файле (между символами новой строки ничего нет, если для таких моментов нет представления POSIX).

Вторая часть файла о часовых поясах состоит из ещё одной заголовочной 44-байтовой, идентичной по структуре из первой части в начале файла, за исключением того, что она описывает следующие за ней данные, которые также идентичны по структуре из первой части файла о часовых поясах, но со следующими отличиями:

*   Значение моментов перевода часов, после заголовка, восьми байтовые значения.

*   В каждой записи о високосной секунде значение високосной секунды является восьми байтовым значением. Накопительный счётчик високосной секунды по прежнему четырёх байтовое значение.

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

  POSIX-строка часового пояса
За второй частью восьмибайтового значения времени следует необязательная третья часть: одиночный символ ASCII новой строки ('\n'), затем текстовая строка, заканчивающаяся вторым символом новой строки. Текстовая строка — это строка часового пояса POSIX; её формат описан в справочной странице tzset(3).

Строка часового пояса POSIX задаёт правило вычисления переводов времени, которое следует за последним переводом времени, явно заданным в файле с информацией о часовом поясе.

  Кратко о формате файла с информацией о часовых поясах

    Часть из четырёхбайтового значения
    (версия заголовка 0x00 или 0x32)
            Запись заголовка
            Времена перевода (четыре байта)
            Индекс времени перевода
            Структуры ttinfo
            Массив аббревиатур часового пояса
            Записи о високосной секунде
            Массив Standard/Wall
            Массив UTC/Local
    Часть из восьмибайтового значения
    (только, если версия первого заголовка равна 0x32,
    версия второго заголовка также 0x32)
            Запись заголовка
            Времена перевода (восемь байт)
            Индекс времени перевода
            Структуры ttinfo
            Массив аббревиатур часового пояса
            Записи о високосной секунде
            Массив Standard/Wall
            Массив UTC/Local
    Третья часть
    (необязательная, только в файлах с версией 0x32)
            Символ новой строки
            Строка часового пояса
            Символ новой строки

СМОТРИТЕ ТАКЖЕ
ctime(3), tzset(3), tzselect(8), timezone/tzfile.h из дерева исходного кода glibc