Содержание страницы
zoneinfo – поддержка часовых поясов IANA¶zoneinfo – IANA time zone support
Новое в версии 3.9.
Исходный код: Lib/zoneinfo
Модуль zoneinfo предоставляет конкретную реализацию часового пояса для поддержки базы данных часовых поясов IANA, изначально описанной в PEP 615. По умолчанию zoneinfo использует системные данные о часовых поясах, если они доступны; если системные данные недоступны, библиотека использует собственный пакет tzdata, доступный на PyPI.
См. также
Использование ZoneInfo¶Using 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, созданные таким образом, совместимы с арифметикой 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)
>>> # Перед переходом с PDT на PST
>>> print(dt_utc.astimezone(LOS_ANGELES))
2020-11-01 01:00:00-07:00
>>> # После перехода с PDT на PST
>>> print((dt_utc + timedelta(hours=1)).astimezone(LOS_ANGELES))
2020-11-01 01:00:00-08:00
Источники данных¶Data sources
Модуль zoneinfo не предоставляет данные о часовых поясах напрямую, а получает информацию о часовых поясах из системной базы данных часовых поясов или из основного пакета PyPI tzdata, если он доступен. Некоторые системы, в частности Windows, не имеют базы данных IANA, поэтому для проектов, нацеленных на кроссплатформенную совместимость и требующих данные о часовых поясах, рекомендуется объявить зависимость от tzdata. Если ни системные данные, ни tzdata недоступны, все вызовы ZoneInfo будут вызывать ZoneInfoNotFoundError.
Настройка источников данных¶Configuring the data sources
При вызове ZoneInfo(key) конструктор сначала ищет в каталогах, указанных в TZPATH, файл, соответствующий key, а в случае неудачи ищет совпадение в пакете tzdata. Это поведение можно настроить тремя способами:
Значение
TZPATHпо умолчанию, если не указано иное, можно настроить на этапе компиляции.TZPATHможно настроить с помощью переменной окружения.Во время выполнения путь поиска можно изменить с помощью функции
reset_tzpath().
Настройка на этапе компиляции¶Compile-time configuration
Путь TZPATH по умолчанию включает несколько стандартных мест развёртывания базы данных часовых поясов (кроме Windows, где нет «общеизвестных» мест для данных часовых поясов). В системах POSIX дистрибьюторы и те, кто собирает Python из исходного кода и знает, где развёрнуты системные данные о часовых поясах, могут изменить путь по умолчанию, указав опцию компиляции TZPATH (или, что более вероятно, configure
flag --with-tzpath), которая должна быть строкой, разделённой os.pathsep.
На всех платформах настроенное значение доступно как ключ TZPATH в sysconfig.get_config_var().
Настройка через переменные окружения¶Environment configuration
При инициализации TZPATH (либо во время импорта, либо при вызове reset_tzpath() без аргументов) модуль zoneinfo будет использовать переменную окружения PYTHONTZPATH, если она существует, для установки пути поиска.
-
PYTHONTZPATH¶ Это строка, разделённая
os.pathsep, содержащая путь поиска часовых поясов. Она должна состоять только из абсолютных, а не относительных путей. Относительные компоненты, указанные вPYTHONTZPATH, использоваться не будут, но в остальном поведение при указании относительного пути определяется реализацией; CPython вызоветInvalidTZPathWarning, но другие реализации могут молча игнорировать ошибочный компонент или вызывать исключение.
Чтобы настроить систему на игнорирование системных данных и использование пакета tzdata, установите PYTHONTZPATH="".
Настройка во время выполнения¶Runtime configuration
Путь поиска TZ также можно настроить во время выполнения с помощью функции reset_tzpath(). Обычно это не рекомендуется, но вполне разумно использовать в тестовых функциях, требующих определённого пути к часовым поясам (или отключения доступа к системным часовым поясам).
Класс ZoneInfo¶The ZoneInfo class
-
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__().Объекты, созданные через этот конструктор, не могут быть pickled (см. pickling).
-
classmethod
ZoneInfo.no_cache(key)¶ Альтернативный конструктор, который обходит кеш конструктора. Он идентичен основному конструктору, но возвращает новый объект при каждом вызове. Это скорее всего будет полезно для целей тестирования или демонстрации, но также может использоваться для создания системы с другой стратегией инвалидации кеша.
Объекты, созданные через этот конструктор, также будут обходить кеш процесса десериализации при десериализации (unpickled).
Внимание
Использование этого конструктора может неожиданным образом изменить семантику объектов datetime, используйте его только в том случае, если уверены, что это необходимо.
Также доступны следующие методы класса:
-
classmethod
ZoneInfo.clear_cache(*, only_keys=None)¶ Метод для инвалидации кеша класса
ZoneInfo. Если аргументы не переданы, все кеши инвалидируются, и следующий вызов основного конструктора для каждого ключа вернёт новый экземпляр.Если в параметр
only_keysпередан итерируемый объект с именами ключей, из кеша будут удалены только указанные ключи. Ключи, переданные вonly_keys, но не найденные в кеше, игнорируются.Предупреждение
Вызов этой функции может неожиданным образом изменить семантику объектов datetime при использовании
ZoneInfo; она изменяет глобальное состояние процесса и поэтому может иметь широкие последствия. Применяйте её, только если это действительно необходимо.
Класс имеет один атрибут:
-
ZoneInfo.key¶ Это атрибут только для чтения, который возвращает значение
key, переданное конструктору; это должен быть ключ поиска в базе данных часовых поясов IANA (например,America/New_York,Europe/ParisилиAsia/Tokyo).Для зон, созданных из файла без указания параметра
key, этому атрибуту будет присвоено значениеNone.Примечание
Хотя существует довольно распространённая практика показывать эти значения конечным пользователям, они предназначены для использования в качестве первичных ключей для представления соответствующих зон и не обязательно являются элементами пользовательского интерфейса. Такие проекты, как CLDR (Unicode Common Locale Data Repository), можно использовать для получения более удобных для пользователя строк из этих ключей.
Строковые представления¶String representations
Строковое представление, возвращаемое при вызове 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(). repr объекта ZoneInfo определяется
реализацией и не обязательно стабилен между версиями, но гарантируется,
что он не является допустимым ключом ZoneInfo.
Сериализация pickle¶Pickle serialization
Вместо сериализации всех данных переходов объекты ZoneInfo
сериализуются по ключу, а объекты ZoneInfo, созданные из файлов (даже те,
для которых указано значение key), не могут быть pickled.
Поведение файла 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возбуждает исключение при попытке pickling. Если конечный пользователь хочет pickle объектZoneInfo, созданный из файла, рекомендуется использовать тип-обёртку или пользовательскую функцию сериализации: либо сериализовать по ключу, либо сохранить содержимое файлового объекта и сериализовать его.
Этот метод сериализации требует, чтобы данные часового пояса для требуемого
ключа были доступны и на сериализующей, и на десериализующей стороне – аналогично тому,
как ссылки на классы и функции должны существовать в обеих средах:
сериализующей и десериализующей. Это также означает, что не даётся никаких гарантий
согласованности результатов при десериализации (unpickling) объекта ZoneInfo,
который был pickled в среде с другой версией данных часового пояса.
Функции¶Functions
-
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, если передан не абсолютный путь.
Глобальные переменные¶Globals
-
zoneinfo.TZPATH¶ Последовательность только для чтения, представляющая путь поиска временной зоны: при создании
ZoneInfoпо ключу ключ объединяется с каждым элементом вTZPATH, и используется первый найденный файл.TZPATHможет содержать только абсолютные пути, никогда – относительные, независимо от способа настройки.Объект, на который указывает
zoneinfo.TZPATH, может измениться при вызовеreset_tzpath(), поэтому рекомендуется использоватьzoneinfo.TZPATH, а не импортироватьTZPATHизzoneinfoили присваиватьzoneinfo.TZPATHдолгоживущей переменной.Для получения дополнительной информации о настройке пути поиска временной зоны см. Настройка источников данных.
Исключения и предупреждения¶Exceptions and warnings
-
exception
zoneinfo.ZoneInfoNotFoundError¶ Возникает, когда создание объекта
ZoneInfoзавершается неудачей, так как указанный ключ не найден в системе. Это подклассKeyError.
-
exception
zoneinfo.InvalidTZPathWarning¶ Возникает, когда
PYTHONTZPATHсодержит недопустимый компонент, который будет отфильтрован, например, относительный путь.