zoneinfo — Поддержка часовых поясов IANA
Добавлен в версии 3.9.
Исходный код: Lib/zoneinfo
Модуль zoneinfo предоставляет конкретное реализацию часовых поясов для поддержки базы данных часовых поясов IANA, как изначально указано в PEP 615. По умолчанию, zoneinfo использует данные часового пояса системы, если они доступны; если данные часового пояса системы недоступны, библиотека переключится на использование пакета tzdata от первоисточника, доступного на 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. Это поведение можно настроить тремя способами:
- По умолчанию
TZPATH, если не указано иное, можно настроить во время компиляции. -
TZPATHможно настроить, используя переменную окружения. - Во время выполнения путь поиска можно изменить с помощью функции
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 зависит от того, как он был создан:
-
ZoneInfo(key): При создании с помощью основного конструктора объектZoneInfoсериализуется по ключу, и при десериализации процесс десериализации использует основной конструктор, и ожидается, что эти объекты будут идентичны другим ссылкам на тот же часовой пояс. Например, еслиeurope_berlin_pkl— это строка, содержащая pickle, построенный изZoneInfo("Europe/Berlin"), ожидается следующее поведение:>>> a = ZoneInfo("Europe/Berlin") >>> b = pickle.loads(europe_berlin_pkl) >>> a is b True -
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 -
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