Spec-Zone.ru › Python 3.13

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

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

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

Модуль zoneinfo предоставляет конкретную реализацию часовых поясов для поддержки базы данных часовых поясов IANA, как изначально указано в PEP 615. По умолчанию, zoneinfo использует данные о часовом поясе системы, если они доступны; если данные о часовом поясе системы недоступны, библиотека будет использовать пакет tzdata по умолчанию, доступный на 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'

Созданные таким образом объекты datetime совместимы с арифметикой datetime и обрабатывают переходы на летнее/зимнее время без дополнительных вмешательств:

>>> 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 по умолчанию с 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="".

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

Путь поиска TZ также можно настроить во время выполнения с помощью функции 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(fobj, /, key=None)

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

Параметр key устанавливает имя зоны для целей __str__() и __repr__().

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

classmethod ZoneInfo.no_cache(key)

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

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

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

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

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

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 Common Locale Data Repository), могут быть использованы для получения более удобных для пользователя строк из этих ключей.

Представления в виде строк

Строковое представление, возвращаемое при вызове str на объекте ZoneInfo, по умолчанию использует свойство 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(). ZoneInfo’s repr определяется реализацией и не обязательно стабилен между версиями, но гарантированно не является допустимым ключом 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(fobj, /, key=None): При создании из файла объект ZoneInfo генерирует исключение при сериализации с помощью pickle. Если конечный пользователь хочет сериализовать с помощью pickle объект ZoneInfo , созданный из файла, рекомендуется использовать оболочку или пользовательскую функцию сериализации: либо сериализовать по ключу, либо сохранить содержимое объекта файла и сериализовать это содержимое.

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

Функции

zoneinfo.available_timezones()

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

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

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

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

Примечание

Эти значения не предназначены для отображения конечным пользователям; для элементов пользовательского интерфейса приложения должны использовать что-то вроде CLDR (Unicode Common Locale Data Repository) для получения более удобных для пользователя строк. См. также предупреждающее примечание о 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–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/zoneinfo.html

Spec-Zone.ru

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