Python datetime: формат даты, разница дней, часовые пояса
Модуль datetime умеет форматировать даты в строки через strftime, разбирать строки через strptime, считать разницу через timedelta и работать с часовыми поясами. Ниже собраны самые частые операции с готовыми результатами.
Дата в строку и обратно
from datetime import datetime, date, timedelta, timezone
dt = datetime(2026, 10, 25, 14, 30, 5)
print(dt.strftime("%d.%m.%Y %H:%M")) # 25.10.2026 14:30
print(dt.isoformat()) # 2026-10-25T14:30:05
print(date(2026, 10, 25).strftime("%d %B %Y")) # 25 October 2026
parsed = datetime.strptime("25.10.2026 14:30", "%d.%m.%Y %H:%M")
print(parsed) # 2026-10-25 14:30:00
print(datetime.fromisoformat("2026-10-25T14:30:05") == dt) # TrueНазвание месяца в %B зависит от локали системы: по умолчанию это английский вариант.
Код | Значение | Код | Значение |
|---|---|---|---|
| Год, 4 цифры |
| Часы, 00–23 |
| Месяц, 01–12 |
| Минуты |
| День месяца |
| Секунды |
| День недели, название |
| Год, 2 цифры |
Прибавить и вычесть время
tomorrow = dt + timedelta(days=1)
print(tomorrow.date()) # 2026-10-26
week_ago = dt - timedelta(weeks=1, hours=2)
print(week_ago) # 2026-10-18 12:30:05Разница между датами
delta = datetime(2026, 12, 31) - datetime(2026, 10, 25)
print(delta.days) # 67
print(delta.total_seconds()) # 5788800.0
print((date(2026, 12, 31) - date(2026, 1, 1)).days) # 364Атрибут days возвращает целые сутки. Если нужны и часы, используйте total_seconds() и делите самостоятельно.
Части даты и день недели
today = date(2026, 10, 25)
print(today.year, today.month, today.day) # 2026 10 25
print(today.weekday()) # 6
print(today.isoweekday()) # 7
print(today.strftime("%A")) # Sunday
print(dt.replace(day=1).date()) # 2026-10-01Метод weekday() возвращает 0 для понедельника и 6 для воскресенья, isoweekday() числа от 1 до 7.
Часовые пояса
from zoneinfo import ZoneInfo
msk = datetime(2026, 10, 25, 12, 0, tzinfo=ZoneInfo("Europe/Moscow"))
print(msk.astimezone(timezone.utc).isoformat()) # 2026-10-25T09:00:00+00:00
print(msk.astimezone(ZoneInfo("Asia/Yekaterinburg")).strftime("%H:%M")) # 14:00Модуль zoneinfo входит в стандартную библиотеку с Python 3.9. На Windows может понадобиться пакет tzdata: pip install tzdata.
Метка времени Unix
print(datetime.fromtimestamp(0, tz=timezone.utc)) # 1970-01-01 00:00:00+00:00
print(int(datetime(2026, 10, 25, tzinfo=timezone.utc).timestamp())) # 1792886400Текущее время
now_utc = datetime.now(timezone.utc)
print(now_utc.tzinfo) # UTCВызов datetime.now() без аргументов возвращает местное время без указания пояса. Для логов и баз данных надёжнее хранить время в UTC.
Частые вопросы
Как получить первое и последнее число месяца?
Первое: dt.replace(day=1). Последнее: возьмите первое число следующего месяца и вычтите один день: (next_month_first - timedelta(days=1)).
Как сравнить две даты?
Объекты date и datetime сравниваются обычными операторами <, ==, >=. Нельзя сравнивать «наивное» время (без пояса) с «осведомлённым» (с поясом), Python выдаст ошибку TypeError.
Как прибавить месяц?
У timedelta нет месяцев. Используйте dateutil.relativedelta(months=1) из пакета python-dateutil или считайте вручную.