TZSET(3)

ИМЯ
tzset, tzname, timezone, daylight - инициализирует информацию о преобразованиях времени

ОБЗОР
#include <time.h>

void tzset (void);

extern char *tzname[2];
extern long timezone;
extern int daylight;

Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)):

tzset(): _POSIX_C_SOURCE
tzname: _POSIX_C_SOURCE
timezone, daylight: _XOPEN_SOURCE
    || /* начиная с glibc 2.19: */ _DEFAULT_SOURCE
    || /* в версиях glibc <= 2.19: */ _SVID_SOURCE

ОПИСАНИЕ
Функция tzset() инициализирует переменную tzname из значения переменной окружения TZ. Данная функция автоматически вызывается другими функциями преобразования времени, которые зависят от часового пояса. В системах, совместимых с System V, она также устанавливает переменные timezone (секунд западнее UTC) и daylight (0, если в часовом поясе не используется переход на летнее время, в противном случае ненулевое значение, если есть времена в прошлом, настоящем или будущем, когда применялись правила перехода).

Если переменной TZ в окружении не существует, то используется системный часовой пояс. Системный часовой пояс настраивается копированием или созданием ссылки на файл в формате tzfile(5) в /etc/localtime. База данных часовых поясов с такими файлами может находиться в системном каталоге часовых поясов (смотрите далее раздел ФАЙЛЫ).

Если переменная TZ в окружении существует, но имеет пустое значение или её величина не может быть представлена ни в одном из перечисленных ниже форматов, то используется UTC (Coordinated Universal Time, всемирное координированное время).

Значение TZ может быть представлено в одном из двух форматов. Первый формат — строка символов, которые явно описывают используемый часовой пояс:

    std offset[dst[offset][,start[/time],end[/time]]]

В спецификации нет пробелов. Строка std определяет аббревиатуру часового пояса и должна содержать три или более символа алфавита. Если она заключена между знаками "меньше" (<) и "больше" (>), набор символов расширяется за счет добавления знаков "плюс" (+), "минус" (-) и цифр. Строка offset, следующая непосредственно за std, обозначает время, которое необходимо добавить к локальному, чтобы получить Всемирное координированное время (UTC). Значение offset положительно, если локальный часовой пояс находится западнее Гринвичского меридиана, и отрицательна, если восточнее. Количество часов колеблется от 0 до 24, а минут и секунд — от 00 до 59:

    [+|-]чч[:мм[:сс]]

Пробелов быть не должно. Строки dst и offset задают название и смещение соответствующего часового пояса по летнему времени. Если offset не указано, то по умолчанию используется значение на час больше поясного времени.

Полем start определяется начало периода летнего времени, а полем end определяется момент перехода обратно на поясное время. Эти поля могут быть представлены в следующих форматах:

Jn  Номер n — это день по Юлианскому календарю (от 1 до 365). Високосный день не учитывается. В этом формате 29 февраля не может быть представлено; 28 февраля — это 59 день, а 1 марта всегда 60 день.

n   Номер n — это день по Юлианскому календарю (от 1 до 365). 29 февраля в високосном году учитывается.

Mm.w.d
    Номер d — это день (0 <= d <= 6) в неделе w (1 <= w <= 5) и месяце m (1 <= m <= 12). Неделя номер 1 — это первая неделя, в которой есть день d, а неделя номер 5 — это последняя неделя, в которой есть день d. День номер 0 — это воскресенье.

В поле time задаётся, когда по действующему времени наступает переход на другое время. Если не указано, то по умолчанию равно 02:00:00.

Вот пример для Новой Зеландии, где поясное (standard) время (NZST) на 12 часов опережает UTC, а летнее (daylight saving) время (NZDT) на 13 часов опережает UTC, которое действует с первого воскресенья октября по третье воскресенье марта, и меняется обратно в 02:00:00 (как значение по умолчанию):
    TZ="NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0"

Второй формат используется, если информация о часовом поясе должна быть получена из файла:

    :[filespec]

Если указание файла filespec опущено или его значение не может быть понято, то используется всемирное координированное время (UTC). Если значение filespec не пусто, то оно определяет другой файл формата tzfile(5), из которого будет получена информация о часовых поясах. Если значение filespec не начинается с символа «/», то этот файл находится в системном каталоге часовых поясов. Если отсутствует двоеточие, то будет опробован каждый из представленных выше форматов TZ.

Вот ещё один пример для Новой Зеландии:

    TZ=":Pacific/Auckland"

ОКРУЖЕНИЕ

TZ  Если эта переменная установлена, то её значение имеет приоритет над настроенным системным часовым поясом.

TZDIR
    Если эта переменная установлена, то её значение имеет приоритет над путём базы данных системных часовых поясов.

ФАЙЛЫ

/etc/localtime
    Файл системного часового пояса.

/usr/share/zoneinfo/
    Системный каталог базы данных часовых поясов.

/usr/share/zoneinfo/posixrules
    Когда строка TZ содержит часовой пояс dst и больше ничего, то из этого файла берутся начальные/конечные правила. Его формат совпадает с tzfile(5). По умолчанию Makefile из zoneinfo создаёт его как жёсткую ссылку на tz-файл America/New_York.

Показанные файлы выше — текущие стандартные расположения файлов, но они могут быть изменены при компиляции glibc.

АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7).
Интерфейс | Атрибут | Значение
tzset() | Безвредность в нитях | MT-Safe env locale

СООТВЕТСТВИЕ СТАНДАРТАМ
POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

ЗАМЕЧАНИЯ

В 4.3BSD имелась функция char *timezone(zone, dst), которая возвращала имя часового пояса, соответствующее первому аргументу (минуты западнее UTC). Если второй аргумент равнялся 0, то использовалось поясное имя, иначе использовалась версия для летнего времени.

СМОТРИТЕ ТАКЖЕ
date(1), gettimeofday(2), time(2), ctime(3), getenv(3), tzfile(5)