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() должно быть достаточно едва ли не для большинства необычных потребностей