Стандарт POSIX указывает, что ctime()
, localtime()
, mktime()
и strftime()
действуют, «как если бы» они вызывали tzset()
. Это означает, что им в действительности не нужно вызывать tzset()
, но они должны вести себя, как если бы эта функция была вызвана. (Формулировка призвана дать определенную гибкость при реализации, в то же время гарантируя правильное поведение кода уровня пользователя.)
На практике это означает, что вы сами почти никогда не будете вызывать tzset()
. Но если понадобится, эта функция есть.
6.1.5.1. Системы BSD: timezone()
, не timezone
Некоторые производные от BSD 4.4 системы вместо переменной POSIX timezone
предоставляют функцию timezone()
:
#include
char *timezone(int zone, int dst);
Аргумент zone
является числом dst
истинно, если действует летнее время. Возвращаемое значение является строкой, дающей имя указанного часового пояса, или значение, выраженное относительно GMT. Эта функция обеспечивает совместимость с функцией V7 с тем же именем и поведением.
Системы GNU/Linux хранят информацию о часовых поясах в файлах и каталогах в /usr/share/zoneinfo
:
$ cd /usr/share/zoneinfo
$ ls -FC
Africa/ Canada/ Factory Iceland MST7MDT Portugal W-SU
America/ Chile/ GB Indian/ Mexico/ ROC WET
Antarctica/ Cuba GB-Eire Iran Mideast/ ROK Zulu
Arctic/ EET GMT Israel NZ Singapore iso3166.tab
Asia/ EST GMT+0 Jamaica NZ-CHAT SystemV/ posix/
Atlantic/ EST5EDT GMT-0 Japan Navajo Turkey posixrules
Australia/ Egypt GMT0 Kwajalein PRC UCT right/
Brazil/ Eire Greenwich Libya PST8PDT US/ zone.tab
CET Etc/ HST MET Pacific/ UTC
CST6CDT Europe/ Hongkong MST Poland Universal
Когда возможно, этот каталог использует прямые ссылки для предоставления одних и тех же данных с разными именами. Например, файлы EST5EDT
и US/Eastern
на самом деле одни и те же:
$ ls -il EST5EDT US/Eastern
724350 -rw-r--r-- 5 root root 1267 Sep б 2002 EST5EDT
724350 -rw-r--r-- 5 root root 1267 Sep 6 2002 US/Eastern
Частью установки системы является выбор часового пояса. Надлежащий файл данных часового пояса помещается затем в /etc/localtime
:
$ file /etc/localtime
/etc/localtime: timezone data
На нашей системе это автономная копия файла для нашего часового пояса. На других системах это может быть символическая ссылка на файл в /usr/share/zoneinfo
. Преимуществом использования отдельной копии является то, что все по-прежнему работает, если /usr
не смонтирован.
Переменная окружения TZ
, если она установлена, перекрывает значение по умолчанию для часового пояса:
$ date /* Дата и время в часовом поясе по умолчанию
*/
Wed Nov 19 06:44:50 EST 2003
$ export TZ=PST8PDT /* Смена часового пояса на Западное
побережье США */
$ date /* Вывести дату и время */
Wed Nov 19 03:45:09 PST 2003