zoneinfo — Поддержка часовых поясов IANA
Новая версия 3.9.
Модуль zoneinfo предоставляет конкретную реализацию часовых поясов для поддержки базы данных часовых поясов IANA, как изначально указано в PEP 615. По умолчанию, zoneinfo использует данные часового пояса системы, если они доступны; если данные часового пояса системы недоступны, библиотека обратится к пакету tzdata первого уровня, доступному в 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 напрямую не предоставляет данные часовых поясов, а вместо этого извлекает информацию о часовых поясах из базы данных часовых поясов системы или пакета PyPI первого уровня tzdata, если он доступен. Некоторые системы, в том числе, в частности, системы Windows, не имеют доступной базы данных IANA, поэтому для проектов, ориентированных на кроссплатформенную совместимость, требующих данных часовых поясов, рекомендуется объявить зависимость от tzdata. Если ни данные системы, ни tzdata недоступны, все вызовы к ZoneInfo будут вызывать ZoneInfoNotFoundError.
Настройка источников данных
Когда вызывается ZoneInfo(key), конструктор сначала ищет файлы, соответствующие key, в каталогах, указанных в TZPATH, а при неудаче ищет совпадения в пакете tzdata. Это поведение можно настроить тремя способами:
- Значение по умолчанию
TZPATH, если не указано иное, может быть настроено на этапе компиляции. -
TZPATHможно настроить с помощью переменной окружения. - На этапе выполнения путь поиска можно изменить с помощью функции
reset_tzpath().
Настройка на этапе компиляции
Значение по умолчанию TZPATH включает несколько стандартных расположений для базы данных часовых поясов (за исключением Windows, где нет известных расположений для данных часовых поясов). В системах POSIX дистрибутивы и те, кто собирает Python из исходного кода, зная, где развернуты данные часового пояса системы, могут изменить путь к часовому поясу по умолчанию, указав параметр компиляции TZPATH (или, скорее всего, флаг configure --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__().Объекты, созданные с помощью этого конструктора, не могут быть сериализованы с помощью пиклирования (см. pickling).
-
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.
Сериализация с помощью пиклирования
Вместо сериализации всех данных переходов, объекты ZoneInfo сериализуются по ключу, а объекты ZoneInfo , созданные из файлов (даже те, у которых есть значение для key ), не могут быть сериализованы с помощью пиклирования.
Поведение файла ZoneInfo зависит от того, как он был создан:
-
ZoneInfo(key): При создании с помощью основного конструктора объектZoneInfoсериализуется по ключу, и при десериализации процесс десериализации использует основной конструктор, поэтому ожидается, что они будут идентичными объектами к другим ссылкам на тот же часовой пояс. Например, еслиeurope_berlin_pkl— это строка, содержащая пикл, созданный из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— это строка, содержащая пикл, созданный из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вызывает исключение при пиклировании. Если конечный пользователь хочет сериализовать с помощью пиклирования объект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–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.9/library/zoneinfo.html