Сообщить об ошибке.

Модуль zoneinfo в Python, база часовых поясов

Поддержка базы данных часовых поясов IANA

Добавлен в Python 3.9.

Модуль zoneinfo предоставляет конкретную реализацию часового пояса для поддержки базы данных часовых поясов IANA. По умолчанию zoneinfo использует данные системного часового пояса, если они доступны. Если данные системного часового пояса недоступны, то библиотека вернется к использованию пакета tzdata, доступного на PyPI.

Класс zoneinfo.ZoneInfo() предназначен для использования в модуле datetime, который предоставляет типы datetime.time и datetime.datetime.

Смотрите также:

  • Первый сторонний пакет tzdata, поддерживаемый разработчиками ядра CPython для предоставления данных о часовых поясах.

Модуль zoneinfo не предоставляет данные о часовом поясе напрямую, а извлекает информацию о часовом поясе из системной базы данных часовых поясов или из основного пакета tzdata, если он доступен. В некоторых системах, включая, в частности, системы Windows, база данных IANA недоступна, поэтому для проектов, нацеленных на кроссплатформенную совместимость, требующих данных о часовых поясах, рекомендуется объявить зависимость от tzdata. Если ни системные данные, ни пакет tzdata недоступны, то все вызовы класса zoneinfo.ZoneInfo() вызовут исключение ZoneInfoNotFoundError.

Настройка источников данных

Когда вызывается класс zoneinfo.ZoneInfo(key), то ключ соответствия файла конструктор сначала ищет в каталогах, указанных в TZPATH, а в случае ошибки ищет совпадение в пакете tzdata. Это поведение можно настроить тремя способами:

Конфигурация при компилировании Python из источников.

По умолчанию zoneinfo.TZPATH включает несколько общих мест развертывания для базы данных часовых поясов (кроме Windows, где нет известных мест для данных часовых поясов).

В системах POSIX, дистрибьюторы и те, кто собирает Python из источника (необходимо знать, где развернуты системные данные о часовых поясах в системе) могут изменить путь часового пояса по умолчанию, указав во время компиляции параметр TZPATH или установить флаг конфигурации --with-tzpath, который должен быть строкой, разделенной os.pathsep.

На всех платформах, настроенное значение доступно как ключ TZPATH в sysconfig.get_config_var().

Конфигурация c использованием переменной среды окружения PYTHONTZPATH.

При инициализации zoneinfo.TZPATH либо во время импорта, либо всякий раз, когда вызывается zoneinfo.reset_tzpath() без аргументов, для установки пути поиска, модуль zoneinfo будет использовать переменную окружения PYTHONTZPATH, если она существует.

PYTHONTZPATH:

Это строка, разделенная os.pathsep, содержащая путь поиска часового пояса. Он должен состоять только из абсолютных, а не относительных путей. Относительные компоненты, указанные в PYTHONTZPATH, использоваться не будут, но в противном случае поведение при указании относительного пути определяется реализацией. CPython вызовет InvalidTZPathWarning, но другие реализации могут игнорировать ошибочный компонент или вызывать исключение.

Чтобы система игнорировала системные данные и использовала пакет tzdata, установите PYTHONTZPATH=''.

Конфигурация во время выполнения программы.

Путь поиска TZ также можно настроить во время выполнения программы при помощи функции zoneinfo.reset_tzpath(). Обычно это не рекомендуется, хотя разумно использовать ее в тестовых функциях, которые требуют использования пути определенного часового пояса или требуют отключения доступа к системным часовым поясам.

Примеры использования модуля zoneinfo:

Класс zoneinfo.ZoneInfo() является конкретной реализацией абстрактного базового класса datetime.tzinfo и предназначен для присоединения к tzinfo либо через конструктор, либо через метод datetime.replace, либо через datetime.astimezone:

>>> from zoneinfo import ZoneInfo
>>> from datetime import datetime, timedelta
>>> dt = datetime(2020, 10, 31, 12, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
# 2020-10-31 12:00:00-07:00
>>> dt.tzname()
# 'PDT'

Часовые пояса поддерживают атрибут fold - автоматический переход на летнее/зимнее время.

>>> dt = datetime(2020, 11, 1, 1, tzinfo=ZoneInfo("America/Los_Angeles"))
>>> print(dt)
# 2020-11-01 01:00:00-07:00
>>> print(dt.replace(fold=1))
# 2020-11-01 01:00:00-08:00