Spec-Zone.ru › Python 3.13

zoneinfo — поддержка часовых поясов IANA

Добавлено в версии 3.9.

Исходный код: Lib/zoneinfo

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

См. также

Module: datetime

Предоставляет типы time и datetime, для работы с которыми предназначен класс ZoneInfo.

Пакет tzdata

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

Доступность: недоступен в WASI.

Этот модуль не работает или недоступен в WebAssembly. Дополнительную информацию см. в разделе Платформы WebAssembly.

Использование 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'

Объекты даты и времени, созданные таким образом, совместимы с арифметическими операциями над датами и временем и обрабатывают переходы на летнее время без дополнительного вмешательства:

>>> dt_add = dt + timedelta(days=1)

>>> print(dt_add)
2020-11-01 12:00:00-08:00

>>> dt_add.tzname()
'PST'

Эти часовые пояса также поддерживают атрибут fold, введённый в PEP 495. Во время переходов смещения, которые приводят к неоднозначному времени (например, при переходе с летнего времени на стандартное), используется смещение, действовавшее до перехода, если fold=0, и смещение, действующее после перехода, если fold=1. Например:

>>> 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

При преобразовании из другого часового пояса для fold будет установлено правильное значение:

>>> from datetime import timezone
>>> LOS_ANGELES = ZoneInfo("America/Los_Angeles")
>>> dt_utc = datetime(2020, 11, 1, 8, tzinfo=timezone.utc)

>>> # Before the PDT -> PST transition
>>> print(dt_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00

>>> # After the PDT -> PST transition
>>> print((dt_utc + timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00

Источники данных

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

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

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

  1. Значение по умолчанию для TZPATH, если оно не задано иным способом, можно настроить во время компиляции.
  2. TZPATH можно настроить с помощью переменной окружения.
  3. Во время выполнения путь поиска можно изменить с помощью функции reset_tzpath().

Настройка во время компиляции

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

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

Настройка окружения

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

PYTHONTZPATH

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

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

Настройка во время выполнения

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

Класс ZoneInfo

class zoneinfo.ZoneInfo(key)

Конкретный подкласс datetime.tzinfo, представляющий часовой пояс IANA, заданный строкой key. Вызовы основного конструктора всегда возвращают объекты, которые сравниваются как идентичные; иначе говоря, если не учитывать сброс кэша с помощью ZoneInfo.clear_cache(), для всех значений key следующее утверждение всегда будет истинным:

a = ZoneInfo(key)
b = ZoneInfo(key)
assert a is b

key должен иметь вид относительного нормализованного пути POSIX без ссылок на родительские каталоги. Если передан ключ, не соответствующий этому формату, конструктор вызовет ValueError.

Если файл, соответствующий key, не найден, конструктор вызовет ZoneInfoNotFoundError.

У класса ZoneInfo есть два альтернативных конструктора:

classmethod ZoneInfo.from_file(file_obj, /, key=None)

Создаёт объект ZoneInfo из файлового объекта, возвращающего байты (например, файла, открытого в двоичном режиме, или объекта io.BytesIO). В отличие от основного конструктора, этот конструктор всегда создаёт новый объект.

Параметр key задаёт название часового пояса для методов __str__() и __repr__().

Объекты, созданные с помощью этого конструктора, нельзя сериализовать с помощью pickle (см. раздел сериализация с помощью pickle).

classmethod ZoneInfo.no_cache(key)

Альтернативный конструктор, обходящий кэш конструктора. Он идентичен основному конструктору, но при каждом вызове возвращает новый объект. Чаще всего он полезен для тестирования или демонстраций, но также может применяться для создания системы с другой стратегией сброса кэша.

Объекты, созданные с помощью этого конструктора, также будут обходить кэш десериализующего процесса при восстановлении из pickle.

Внимание

Использование этого конструктора может неожиданным образом изменить семантику объектов даты и времени. Используйте его только в том случае, если уверены, что он вам нужен.

Также доступны следующие методы класса:

classmethod ZoneInfo.clear_cache(*, only_keys=None)

Метод для сброса кэша класса ZoneInfo. Если аргументы не переданы, сбрасываются все кэши, и при следующем вызове основного конструктора для каждого ключа будет возвращён новый экземпляр.

Если параметру only_keys передан итерируемый объект с именами ключей, из кэша будут удалены только указанные ключи. Ключи, переданные параметру only_keys, но отсутствующие в кэше, игнорируются.

Предупреждение

Вызов этой функции может неожиданным образом изменить семантику объектов даты и времени, использующих ZoneInfo; она изменяет состояние модуля и поэтому может иметь широкие последствия. Используйте её только в том случае, если уверены, что она вам нужна.

У класса есть один атрибут:

ZoneInfo.key

Это доступный только для чтения атрибут, возвращающий значение key, переданное конструктору. Оно должно быть ключом поиска в базе данных часовых поясов IANA (например, America/New_York, Europe/Paris или Asia/Tokyo).

Для часовых поясов, созданных из файла без указания параметра key, этому атрибуту будет присвоено значение None.

Примечание

Хотя такие значения довольно часто показывают конечным пользователям, они предназначены для использования в качестве первичных ключей, представляющих соответствующие часовые пояса, и не обязательно подходят для отображения пользователю. Для получения более понятных пользователю строк из этих ключей можно использовать такие проекты, как CLDR (Общий репозиторий данных локалей Unicode).

Строковые представления

Строковое представление объекта ZoneInfo, возвращаемое при вызове str, по умолчанию использует атрибут ZoneInfo.key (см. примечание об использовании в документации атрибута):

>>> zone = ZoneInfo("Pacific/Kwajalein")
>>> str(zone)
'Pacific/Kwajalein'

>>> dt = datetime(2020, 4, 1, 3, 15, tzinfo=zone)
>>> f"{dt.isoformat()} [{dt.tzinfo}]"
'2020-04-01T03:15:00+12:00 [Pacific/Kwajalein]'

Для объектов, созданных из файла без указания параметра key, str вызывает repr(). Значение repr объекта ZoneInfo определяется реализацией и не обязательно будет неизменным в разных версиях, однако гарантируется, что оно не является допустимым ключом ZoneInfo.

Сериализация с помощью pickle

Вместо сериализации всех данных о переходах объекты ZoneInfo сериализуются по ключу, а объекты ZoneInfo, созданные из файлов (даже если для них задано значение key), сериализовать с помощью pickle нельзя.

Поведение файла ZoneInfo зависит от способа его создания:

  1. ZoneInfo(key): При создании с помощью основного конструктора объект ZoneInfo сериализуется по ключу, а при десериализации используется основной конструктор. Поэтому предполагается, что этот объект будет тем же объектом, что и другие ссылки на тот же часовой пояс. Например, если europe_berlin_pkl — строка, содержащая pickle, созданный из ZoneInfo("Europe/Berlin"), ожидается следующее поведение:

    >>> a = ZoneInfo("Europe/Berlin")
    >>> b = pickle.loads(europe_berlin_pkl)
    >>> a is b
    True
    
  2. ZoneInfo.no_cache(key): При создании с помощью конструктора, обходящего кэш, объект ZoneInfo также сериализуется по ключу, но при десериализации используется конструктор, обходящий кэш. Если europe_berlin_pkl_nc — строка, содержащая pickle, созданный из ZoneInfo.no_cache("Europe/Berlin"), ожидается следующее поведение:

    >>> a = ZoneInfo("Europe/Berlin")
    >>> b = pickle.loads(europe_berlin_pkl_nc)
    >>> a is b
    False
    
  3. ZoneInfo.from_file(file_obj, /, key=None): При создании из файла объект ZoneInfo вызывает исключение при попытке сериализации с помощью pickle. Если конечному пользователю нужно сериализовать с помощью pickle объект ZoneInfo, созданный из файла, рекомендуется использовать тип-обёртку или пользовательскую функцию сериализации: либо сериализовать объект по ключу, либо сохранить содержимое файлового объекта и сериализовать его.

Этот способ сериализации требует, чтобы данные часового пояса для нужного ключа были доступны как на стороне сериализации, так и на стороне десериализации, подобно тому как предполагается наличие ссылок на классы и функции в обеих средах. Это также означает, что согласованность результатов при восстановлении из pickle объекта ZoneInfo не гарантируется, если он был сериализован в среде с другой версией данных часовых поясов.

Функции

zoneinfo.available_timezones()

Возвращает множество всех допустимых ключей часовых поясов IANA, доступных в любом каталоге пути поиска часовых поясов. При каждом вызове функции множество формируется заново.

Эта функция включает только канонические названия часовых поясов и не включает «специальные» часовые пояса, например из каталогов posix/ и right/, а также часовой пояс posixrules.

Внимание

Эта функция может открыть большое количество файлов: лучший способ определить, является ли файл в пути поиска допустимым файлом часового пояса, — прочитать «магическую строку» в его начале.

Примечание

Эти значения не предназначены для показа конечным пользователям; для пользовательских элементов приложениям следует использовать, например, CLDR (Общий репозиторий данных локалей Unicode), чтобы получить более понятные строки. См. также предупреждение об использовании ZoneInfo.key.

zoneinfo.reset_tzpath(to=None)

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

Вызов reset_tzpath не сбрасывает кэш ZoneInfo, поэтому вызовы основного конструктора ZoneInfo будут использовать новый TZPATH только при отсутствии записи в кэше.

Параметр to должен быть последовательностью строк или объектов os.PathLike, а не строкой; все элементы должны быть абсолютными путями. Если передан не абсолютный путь, будет вызвано исключение ValueError.

Глобальные переменные

zoneinfo.TZPATH

Доступная только для чтения последовательность, представляющая путь поиска часовых поясов. При создании объекта ZoneInfo по ключу этот ключ объединяется с каждым элементом TZPATH; используется первый найденный файл.

TZPATH может содержать только абсолютные пути, но не относительные, независимо от способа настройки.

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

Дополнительную информацию о настройке пути поиска часовых поясов см. в разделе Настройка источников данных.

Исключения и предупреждения

exception zoneinfo.ZoneInfoNotFoundError

Возникает, если не удаётся создать объект ZoneInfo, поскольку указанный ключ не найден в системе. Это подкласс KeyError.

exception zoneinfo.InvalidTZPathWarning

Возникает, если PYTHONTZPATH содержит недопустимый компонент, который будет отфильтрован, например относительный путь.

© 2001–2025 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/zoneinfo.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API