Spec-Zone.ru › Python 3.11

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'

Дата и время, построенные таким образом, совместимы с арифметикой 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 напрямую не предоставляет данные часовых поясов, а вместо этого извлекает информацию о часовых поясах из базы данных часовых поясов системы или пакета PyPI tzdata от стороннего разработчика, если он доступен. Некоторые системы, в том числе, в первую очередь системы 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__().

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

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.

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

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

Поведение файла ZoneInfo зависит от того, как он был создан:

  1. ZoneInfo(key): При создании с помощью основного конструктора объект ZoneInfo сериализуется по ключу, и при десериализации процесс десериализации использует основной, и поэтому ожидается, что эти объекты будут такими же, как и другие ссылки на тот же часовой пояс. Например, если europe_berlin_pkl — строка, содержащая пикл, построенный из 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 — строка, содержащая пикл, построенный из 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 вызывает исключение при сериализации с помощью пикла. Если пользователь хочет сериализовать с помощью пикла объект 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–2023 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.11/library/zoneinfo.html

Spec-Zone.ru

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