Книга: Linux программирование в примерах

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

Оглавление книги


Генерация: 3.677. Запросов К БД/Cache: 3 / 1
поделиться
Вверх Вниз