Spec-Zone.ru › Python 3.10

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

Новая версия с 3.9.

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

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

См. также

Module: datetime

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

Пакет tzdata

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

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

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

Строковое представление, возвращаемое при вызове 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 будет выброшено, если передано что-либо, кроме абсолютного пути.

END_OF_DOCUMENT_MARKER ```

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

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.10/library/zoneinfo.html

Spec-Zone.ru

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