Python datetime: формат даты, разница дней, часовые пояса

Категория: Python · Язык: Python · Обновлено:

Модуль datetime умеет форматировать даты в строки через strftime, разбирать строки через strptime, считать разницу через timedelta и работать с часовыми поясами. Ниже собраны самые частые операции с готовыми результатами.

Дата в строку и обратно

Python
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 зависит от локали системы: по умолчанию это английский вариант.

Код

Значение

Код

Значение

%Y

Год, 4 цифры

%H

Часы, 00–23

%m

Месяц, 01–12

%M

Минуты

%d

День месяца

%S

Секунды

%A

День недели, название

%y

Год, 2 цифры

Прибавить и вычесть время

Python
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

Разница между датами

Python
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() и делите самостоятельно.

Части даты и день недели

Python
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.

Часовые пояса

Python
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

Python
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

Текущее время

Python
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 или считайте вручную.