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'
Дата и время, построенные таким образом, совместимы с арифметикой 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
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 зависит от того, как он был создан:
-
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), чтобы получить более удобные для пользователя строки. См. также предупреждение в примечании к
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