Pull to refresh

Tzdata — глобальная база знаний о часовых поясах

Reading time 6 min
Views 39K
Если нам где-либо (например, в каких-то приложениях) требуется работать не только с универсальным временем UTC, но и с местным временем в различных точках Земли, то здесь встаёт вопрос о необходимости некой базы знаний о том, как вычисляется локальное время относительно UTC в различных регионах мира.

Многие Unix-like системы для хранения информации обо всех мировых часовых поясах используют базу tzdata (она же tz database, она же zoneinfo database, она же Olson database — в честь Артура Олсона, основателя этой базы знаний).

Впервые начал собирать эту базу Артур Дэвид Олсон (Arthur David Olson), позже к этому проекту подключились и другие участники. Сейчас же основным коммитером новой информации в базу tzdata является Пол Эггерт (Paul Eggert), а Артур Олсон сейчас занимается разработкой и поддержкой утилит для работы с локальным временем и данными о часовых поясах (пакет tzcode).

В базе tzdata содержится детальная информация обо всех часовых поясах во всех регионах мира:
— координатная привязка основных населённых пунктов, характеризующих часовой пояс;
— смещение локального времени в различных регионах относительно универсального времени UTC;
— указано, в каких регионах применяется летнее время (DST), насколько оно смещается относительно стандартного, указаны точные даты и время переключения на летнее время и обратно в различных регионах в различные периоды;
— информация о високосных секундах (leap seconds).

Важной особенностью базы tzdata является то, что она не просто хранит текущее состояние всех мировых часовых поясов (т.е. текущие правила расчёта локального времени относительно UTC в каждом регионе мира), она ещё хранит все изменения этих правил расчёта локального времени для всех регионов за всё время с начала Unix-эпохи (1 января 1970). Допустим, какая-то страна своим политическим решением перешла в другой часовой пояс — эта информация есть в tzdata с точностью до секунды, когда это произошло; какая-то страна изменила дату перехода на летнее время — эта информация есть в tzdata с точностью до секунды, когда это произошло; какая-то страна отменила переход на летнее время — эта информация есть в tzdata с точностью до секунды, когда это произошло и т.д.

Благодаря этой особенности, можно вести точные расчёты времени для разных стран за разные промежутки времени.

Например, локальное время:
2010-12-01 14:00 (MSK) — соответствует 2010-12-01 11:00 (UTC)
2011-12-01 14:00 (MSK) — соответствует 2011-12-01 10:00 (UTC)
Казалось бы, одинаковое название часового пояса и одинаковое локальное время (только год разный). Но в один исторический период часовая зона MSK соответствовала UTC+03:00, а в другой исторический период та же самая часовая зона MSK соответствовала уже UTC+04:00.
И благодаря базе tzdata все эти неоднозначности легко решаются, т.к. там хранится подробная информация о том, когда и как рассчитывалось время в каждом из часовых поясов в каждый из временных периодов (с 1970 года).

Если иметь только текущее состояние всех часовых зон (без исторической памяти), то подобные неоднозначности локальных часовых зон никогда не разрешить. И база tzdata как раз и решает задачу сбора и консолидации всей этой информации о часовых поясах со всего мира.

Информация об исчислении времени в различных регионах мира для базы tzdata собирается совместно участниками opensource-сообщества со всего мира, затем присланная информация проверяется, обсуждается, уточняется, консолидируется и в итоге коммитится в файлы tzdata. Исходники tzdata содержат всю информацию обо всех часовых поясах в текстовом человекочитаемом виде с комментариями и пояснениями. Далее эти текстовые файлы компилируются (утилитой zic) и в системах используются уже в скомпилированном бинарном виде. Причём скомпилированные файлы tzdata, хоть и бинарные, но они не содержат исполняемого кода и платформонезависимы. В большинстве unix-подобных ОС скомпилированные файлы с описанием часовых зон из пакета tzdata можно найти здесь: /usr/share/zoneinfo/

Название часовых поясов в базе tzdata указывается в формате Area/Location (Регион/Город), например, Europe/Moscow, Europe/Minsk, Asia/Omsk, Asia/Magadan, America/New_York и т.д.
Полный список мировых локаций (с координатной привязкой), с которыми проассоциированы мировые часовые пояса, можно найти в файле zone.tab, который обычно находится в директории tzdata: /usr/share/zoneinfo/zone.tab

Официальные ресурсы проекта tzdata:
HTTP: http://cs.ucla.edu/~eggert/tz/
FTP:: ftp://elsie.nci.nih.gov/pub/
(FTP-сервер временно закрыт на время судебного разбирательства).

Файлы проекта tzdata на официальных серверах ICANN:
HTTP: http://www.iana.org/time-zones
FTP: ftp://ftp.iana.org/tz/
Rsync: rsync://rsync.iana.org/tz/

Временные зеркала проекта tzdata:
HTTP:
http://www.twinsun.com/tz/tz-link.htm
http://tzmirror.appealingapps.de/
http://tzmirror.sunbase.org/
http://www.mailstation.de/tzmirror/
http://www.foo.be/mirrors/tzmirror/
http://www.localhost.lu/mirrors/tzmirror/
FTP:
ftp://tzmirror.appealingapps.de
ftp://munnari.oz.au/pub

Информация, собранная в tzdata, распространяется свободно для всех желающих без каких-либо лицензионных ограничений (public domain). Любой может свободно взять (как в исходниках, так и в бинарном виде) и использовать её в своих приложениях/библиотеках/сервисах. И многие разработчики/вендоры дистрибутивов ОС (в частности Linux/BSD/MacOS) и различного ПО именно так и делают.

В мире opensource (да и не только) база tzdata де-факто является стандартным источником информации обо всех мировых часовых поясах и истории их изменений. Базу tzdata используют все GNU/Linux-дистрибутивы, BSD-системы (FreeBSD, NetBSD, OpenBSD, DragonFly BSD), Solaris, UnixWare, AIX (6.1 и выше), Cygwin а также Mac OS X и некоторые другие unix-like дистрибутивы. Мобильные ОС: Android, Apple iOS, Maemo/MeeGo тоже используют tzdata. Кроме того, данные из tzdata используется в ряде СУБД: MySQL, Oracle DB, PostgreSQL и др., а также в различных языках, фреймворках, библиотеках, модулях: PHP5, Perl (модули DateTime::TimeZone и DateTime::LeapSecond), Python (модуль pytz), GNU C Library (glibc), .NET Framework (модуль zoneinfo), Java Runtime Environment и др.

Благодаря единой глобальной базе знаний tzdata, каждому разработчику ОС и ПО не нужно самостоятельно собирать и поддерживать внутри своего проекта в актуальном состоянии информацию о мировых часовых поясах. Все её получают из единого источника, и везде она идентична (если вовремя обновлять tzdata).

Версии tzdata нумеруются следующим образом. Сначала четырёхзначное число, означающее год выхода этой версии, а потом одна буква латинского алфавита по порядку: a, b, c, d… и т.д. по мере выхода новых версий tzdata в течение одного года. Например, в 2010 году выходили версии tzdata: 2010a, 2010b, 2010c… и далее до версии 2010o. В 2011 году выходили версии tzdata: 2011a, 2011b, 2011c… и далее до 2011l (на день написания этой статьи это пока последняя версия tzdata).

Если вы используете какой-либо Linux-дистрибутив, который вы регулярно обновляете из репозиториев, то скорее всего последняя версия пакета tzdata уже установлена у вас в системе.
Даты выхода нескольких недавних релизов tzdata на примере Ubuntu:
12 сентября 2011 — исходники tzdata обновились до версии 2011j;
14 сентября 2011 — пакет tzdata обновился до версии 2011j в апстриме Ubuntu (Debian Unstable);
20 сентября 2011 — пакет tzdata 2011j поступил в основной репозиторий Ubuntu;
26 сентября 2011 — исходники tzdata обновились до версии 2011k;
26 сентября 2011 — пакет tzdata обновился до версии 2011k в апстриме Ubuntu (Debian Unstable);
04 октября 2011 — пакет tzdata 2011k поступил в основной репозиторий Ubuntu;
10 октября 2011 — исходники tzdata обновились до версии 2011l (на момент написания статьи пакетов под Ubuntu ещё не было).

В Linux-дистрибутивах с пакетными менеджерами можете просто посмотреть версию текущего установленного пакета tzdata. Например, в Debian/Ubuntu это можно сделать командой:
dpkg -s tzdata |grep Version

Если в своих проектах вам необходимо использовать информацию о часовых поясах и локальном времени в различных регионов, то рекомендую вам для этих целей использовать базу tzdata, а не изобретать свой велосипед. Это поможет вам, во-первых, сэкономить время, а во-вторых, всегда иметь актуальную базу истории изменения мировых часовых зон для проведения точных расчётов с локальным временем в настоящем и прошлом.

Правовые трудности проекта tzdata


30 сентября 2011 — в федеральный суд США в Бостоне поступил гражданский иск по поводу незаконного использования в tzdata информации, взятой из программных продуктов «ACS Atlas»/«ACS International Atlas»/«ACS American Atlas», которые компания Astrolabe, Inc. распространяла под коммерческой лицензией, и на которые она имеет интеллектуальные права.
Истец по этому делу: компания Astrolabe, Inc.
Ответчики: Артур Дэвид Олсон и Пол Эггерт (мейнтейнеры и координаторы проекта tzdata).
(топик на Хабре об этом)

6 октября 2011 — Артур Девид Олсон в списках рассылки проекта tzdata (Newsgroups: gmane.comp.time.tz) сообщил, что в связи с этим судебным преследованием он вынужден на всякий случай до решения суда остановить работу официального FTP-сервера со всеми файлами проекта tzdata.
Сразу после этого другие участники проекта tzdata открыли несколько временных HTTP/FTP-зеркал, чтобы доступ к этим файлам всё же мог получить любой желающий (см. выше временные зеркала проекта tzdata)

14 октября 2011 — международная организация ICANN выпустила пресс-релиз (PDF), в котором сообщила, что они получили предложение поддержать проект TZ Database (tzdata) и объявили, что они берут на себя поддержку проекта tzdata пока на временной основе.
Будущее развитие и поддержка единой глобальной стандартизованной базы часовых зон будет регламентироваться документом, который уже разрабатывается IETF. С черновиком этого документа можно ознакомиться здесь:
tools.ietf.org/html/draft-lear-iana-timezone-database-04

Судебное разбирательство по этому делу ещё не закончено (на момент написания этой статьи).

 
CC BY License logo
Автор статьи: Роман Тик <ya.roman.tik {аt} yandex.ru>
Текст статьи распространяется на условиях лицензии «Creative Commons Attribution 3.0 Unported» (CC BY 3.0). Вы можете свободно копировать, редактировать и использовать в любых целях этот текст при обязательном указании авторства.
Tags:
Hubs:
+60
Comments 12
Comments Comments 12

Articles