zoneinfo — Поддержка часового пояса IANA¶
Добавлено в версии 3.9.
Исходный код: Lib/zoneinfo
Модуль zoneinfo предоставляет конкретную реализацию часового пояса для поддержки базы данных часовых поясов IANA, как первоначально указано в PEP 615. По умолчанию zoneinfo использует данные о системном часовом поясе, если они доступны; если данные о системном часовом поясе недоступны, библиотека вернется к использованию пакета tzdata, доступного в PyPI, от первого производителя.
См.также
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten и wasm32-wasi. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Используя 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
При переводе из другого часового пояса для кратности будет установлено правильное значение:
>>> 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. Если ни те, ни другие системные данные не доступны, все вызовы ZoneInfo будут вызывать ZoneInfoNotFoundError.
Настройка источников данных¶
При вызове ZoneInfo(key) конструктор сначала выполняет поиск в каталогах, указанных в TZPATH, в поисках файла, соответствующего key, и в случае сбоя ищет соответствие в пакете tzdata. Это поведение можно настроить тремя способами:
Значение по умолчанию
TZPATH, если не указано иное, может быть настроено по адресу compile time.TZPATHможно настроить с помощью an environment variable.При runtime можно изменять путь поиска с помощью функции
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__().Объекты, созданные с помощью этого конструктора, не могут быть выбраны (см. pickling).
- classmethod ZoneInfo.no_cache(key)¶
Альтернативный конструктор, который обходит кэш конструктора. Он идентичен основному конструктору, но при каждом вызове возвращает новый объект. Скорее всего, это будет полезно для тестирования или демонстрации, но также может быть использовано для создания системы с другой стратегией аннулирования кэша.
Объекты, созданные с помощью этого конструктора, также будут обходить кэш процесса десериализации при распаковке.
Осторожно
Использование этого конструктора может неожиданным образом изменить семантику ваших дат и времени, используйте его только в том случае, если вы знаете, что это необходимо.
Также доступны следующие методы класса:
- classmethod ZoneInfo.clear_cache(*, only_keys=None)¶
Метод для аннулирования кэша в классе
ZoneInfo. Если аргументы не переданы, все кэши становятся недействительными, и следующий вызов первичного конструктора для каждого ключа вернет новый экземпляр.Если в параметр
only_keysпередан повторяемый набор имен ключей, из кэша будут удалены только указанные ключи. Ключи, переданные вonly_keys, но не найденные в кэше, игнорируются.Предупреждение
Вызов этой функции может неожиданным образом изменить семантику datetimes с использованием
ZoneInfo; это изменяет глобальное состояние всего процесса и, следовательно, может иметь самые разные последствия. Используйте ее только в том случае, если вы знаете, что это необходимо.
У класса есть один атрибут:
- ZoneInfo.key¶
Это доступный только для чтения attribute, который возвращает значение
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 зависит от того, как он был создан:
ZoneInfo(key): При построении с помощью конструктора primary объектZoneInfoсериализуется по ключу, а при десериализации процесс десериализации использует primary, и, таким образом, ожидается, что это будет тот же объект, что и другие ссылки на то же время зона. Например, если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), чтобы получить более удобные для пользователя строки. Смотрите также предупреждение о
ZoneInfo.key.
- zoneinfo.reset_tzpath(to=None)¶
Устанавливает или сбрасывает путь поиска по часовому поясу (
TZPATH) для модуля. При вызове без аргументов для параметраTZPATHустанавливается значение по умолчанию.Вызов
reset_tzpathне приведет к аннулированию кэшаZoneInfo, и поэтому вызовы основного конструктораZoneInfoбудут использовать новый конструкторTZPATHтолько в случае пропуска кэша.Параметр
toдолжен быть sequence строк или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содержит недопустимый компонент, который будет отфильтрован, например относительный путь.