Spec-Zone.ru › Python 3.12

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

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

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

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

См. также

Module: datetime

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

Пакет tzdata

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

Доступность: не Emscripten, не WASI.

Этот модуль не работает и недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. См. Платформы 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 от первоисточника на PyPI tzdata, если он доступен. Некоторые системы, в том числе, в частности, Windows, не имеют доступной базы данных IANA, поэтому для проектов, ориентированных на кросс-платформенную совместимость и требующих данных часовых поясов, рекомендуется объявить зависимость от tzdata. Если ни данные системы, ни tzdata недоступны, все вызовы к ZoneInfo приведут к возникновению исключения ZoneInfoNotFoundError.

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

При вызове ZoneInfo(key) конструктор сначала ищет в директориях, указанных в TZPATH, файл, соответствующий key, а при неудаче ищет совпадение в пакете 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), могут использоваться для получения более удобных для пользователя строк из этих ключей.

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

Строковое представление, возвращаемое при вызове 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), чтобы получить более удобные для пользователя строки. См. также примечание предостережения о 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.12/library/zoneinfo.html

Spec-Zone.ru

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