6.1.5.1. Системы BSD: timezone() , не timezone
6.1.5.1. Системы BSD: timezone(), не timezone
Некоторые производные от BSD 4.4 системы вместо переменной POSIX timezone предоставляют функцию timezone():
#include <time.h> /* BSD */
char *timezone(int zone, int dst);
Аргумент zone является числом минут западнее GMT, a 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
Широкое распространение этой функции делает переносимое использование переменной POSIX timezone трудной. К счастью, мы не видим большой потребности в ней strftime() должно быть достаточно едва ли не для большинства необычных потребностей