Часовые пояса с zoneinfo
Работайте с объектами datetime, учитывающими часовой пояс
«Часовые пояса с zoneinfo» — бесплатный урок Python Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Python Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Python Academy содержит 4 уроков всего.
Наивные и часовые объекты даты и времени
Наивный объект даты и времени не содержит сведений о часовом поясе — он просто говорит «2 часа дня», но не уточняет, о каких именно 2 часах дня идёт речь. Часовой объект даты и времени содержит часовой пояс и поэтому однозначно задаёт момент времени в любой точке мира.
Часовые объекты даты и времени предотвращают ошибки, когда пользователи находятся в разных регионах.
from datetime import datetime
naive = datetime(2026, 5, 30, 14, 0)
print(naive.tzinfo)Импорт zoneinfo
В Python 3.9 и более поздних версиях zoneinfo входит в стандартную библиотеку. Импортируйте ZoneInfo и передайте название часового пояса IANA, например 'Europe/Istanbul' или 'America/New_York'.
from zoneinfo import ZoneInfo
tz = ZoneInfo('Europe/Istanbul')
print(tz)Создание часового объекта даты и времени
При создании объекта даты и времени передайте tzinfo=ZoneInfo(...), чтобы сделать его часовым. Теперь объект точно знает, к какому региону он относится.
from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print(d)
print(d.tzinfo)UTC как опорная точка
UTC — универсальная точка отсчёта. Используйте datetime.now(ZoneInfo('UTC')), чтобы получить текущее время UTC с часовым поясом. Хранить время в UTC — лучшая практика.
from datetime import datetime
from zoneinfo import ZoneInfo
utc_now = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
print(utc_now)Преобразование между часовыми поясами
.astimezone(tz) преобразует часовой объект даты и времени в другой часовой пояс, изменяя показания часов так, чтобы они по-прежнему обозначали тот же момент.
from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
ist = utc.astimezone(ZoneInfo('Europe/Istanbul'))
print('UTC:', utc)
print('Istanbul:', ist)Один момент, разные показания часов
После преобразования показания часов различаются, но исходный момент остаётся тем же. При сравнении двух часовых объектов даты и времени сравниваются реальные моменты, а не отображаемые цифры.
from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 11, 0, tzinfo=ZoneInfo('UTC'))
ny = utc.astimezone(ZoneInfo('America/New_York'))
print(utc == ny)Чтение смещения относительно UTC
Метод .utcoffset() возвращает timedelta, показывающий, насколько данный часовой пояс в этот момент отличается от UTC, включая поправку на летнее время.
from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print('Offset:', d.utcoffset())Переход на летнее время обрабатывается автоматически
zoneinfo использует системную базу данных часовых поясов, поэтому знает, когда начинается и заканчивается переход на летнее время. Один и тот же часовой пояс может иметь разные смещения в течение года.
from datetime import datetime
from zoneinfo import ZoneInfo
winter = datetime(2026, 1, 15, 12, 0, tzinfo=ZoneInfo('America/New_York'))
summer = datetime(2026, 7, 15, 12, 0, tzinfo=ZoneInfo('America/New_York'))
print('Winter:', winter.utcoffset())
print('Summer:', summer.utcoffset())Привязка часового пояса к наивному времени
Если наивный объект даты и времени обозначает известное местное время, добавьте часовой пояс с помощью .replace(tzinfo=...). Это помечает объект, не изменяя показания часов.
from datetime import datetime
from zoneinfo import ZoneInfo
naive = datetime(2026, 5, 30, 9, 0)
aware = naive.replace(tzinfo=ZoneInfo('Europe/Istanbul'))
print(aware)Не смешивайте наивные и часовые объекты
Нельзя вычитать наивный объект даты и времени из часового или сравнивать их — Python вызывает исключение TypeError. Следите, чтобы во всей программе объекты даты и времени были согласованы.
from datetime import datetime
from zoneinfo import ZoneInfo
naive = datetime(2026, 5, 30, 9, 0)
aware = datetime(2026, 5, 30, 9, 0, tzinfo=ZoneInfo('UTC'))
try:
print(aware - naive)
except TypeError as e:
print('Error:', e)Форматирование с часовым поясом
Код %Z выводит название часового пояса, а %z — числовое смещение при форматировании часового объекта даты и времени.
from datetime import datetime
from zoneinfo import ZoneInfo
d = datetime(2026, 5, 30, 14, 0, tzinfo=ZoneInfo('Europe/Istanbul'))
print(d.strftime('%Y-%m-%d %H:%M %Z %z'))Быстрая проверка
В чём состоит ключевое различие между наивным и часовым объектом даты и времени?
Повторение: часовые пояса с zoneinfo
Итоги:
- Наивные объекты даты и времени не содержат сведений о часовом поясе, а часовые содержат
tzinfo. - Используйте
ZoneInfo('Region/City')из модуляzoneinfo. .astimezone()преобразует часовой объект даты и времени в другой часовой пояс.zoneinfoавтоматически обрабатывает переход на летнее время; никогда не смешивайте наивные и часовые объекты даты и времени.
from datetime import datetime
from zoneinfo import ZoneInfo
utc = datetime(2026, 5, 30, 12, 0, tzinfo=ZoneInfo('UTC'))
print(utc.astimezone(ZoneInfo('Europe/Istanbul')))Часто задаваемые вопросы
Урок «Часовые пояса с zoneinfo» бесплатный?
Да — полный текст урока «Часовые пояса с zoneinfo» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Python Academy, подпишись на CoddyKit PRO. Курс Python Academy содержит 4 уроков всего.
Чему я научусь в уроке «Часовые пояса с zoneinfo»?
Работайте с объектами datetime, учитывающими часовой пояс Ты практикуешь Python Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Python Academy?
Предыдущий опыт не требуется. Python Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Часовые пояса с zoneinfo»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Python Academy?
Да. Каждый урок Python Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- date, time, datetime
- Timedelta и арифметика
- Форматирование и разбор
- Часовые пояса с zoneinfo