Если нам где-либо (например, в каких-то приложениях) требуется работать не только с универсальным временем 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 можно найти здесь:
Название часовых поясов в базе tzdata указывается в формате Area/Location (Регион/Город), например, Europe/Moscow, Europe/Minsk, Asia/Omsk, Asia/Magadan, America/New_York и т.д.
Полный список мировых локаций (с координатной привязкой), с которыми проассоциированы мировые часовые пояса, можно найти в файле zone.tab, который обычно находится в директории tzdata:
Официальные ресурсы проекта 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 это можно сделать командой:
Если в своих проектах вам необходимо использовать информацию о часовых поясах и локальном времени в различных регионов, то рекомендую вам для этих целей использовать базу 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
Судебное разбирательство по этому делу ещё не закончено (на момент написания этой статьи).
Многие 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
Судебное разбирательство по этому делу ещё не закончено (на момент написания этой статьи).
![]() |
Автор статьи: Роман Тик <ya.roman.tik {аt} yandex.ru> Текст статьи распространяется на условиях лицензии «Creative Commons Attribution 3.0 Unported» (CC BY 3.0). Вы можете свободно копировать, редактировать и использовать в любых целях этот текст при обязательном указании авторства. |