Работа с датами и временем

Расписание невозможно без работы с датами. Модуль datetime считает разницу между датами, прибавляет дни и форматирует время — это основа любого «делай по понедельникам».
Суть: datetime — момент времени, timedelta — промежуток. Их можно складывать и вычитать. strftime форматирует дату в строку, strptime разбирает строку обратно.

Прежде чем запускать скрипты по расписанию, нужно уверенно обращаться с датами. «Отчёт за прошлую неделю», «счета старше 30 дней», «каждый последний день месяца» — за всем этим стоит арифметика дат. В Python её ведёт модуль datetime: класс datetime хранит конкретный момент, а timedelta — промежуток времени. Оба — часть stdlib и работают в браузере.

Главная идея — даты можно вычитать и складывать с промежутками, как числа. Это решает большинство задач с расписанием.

Попробуй сам ▶

from datetime import datetime, timedelta

now = datetime(2026, 6, 22, 14, 30)
print('Сейчас:', now.strftime('%d.%m.%Y %H:%M'))

# Арифметика дат
week_ago = now - timedelta(days=7)
deadline = now + timedelta(days=3, hours=12)
print('Неделю назад:', week_ago.strftime('%d.%m.%Y'))
print('Дедлайн:    ', deadline.strftime('%d.%m.%Y %H:%M'))

# Разница между датами
invoice_date = datetime(2026, 5, 1)
age = now - invoice_date
print(f'Счёту {age.days} дней')
if age.days > 30:
    print('Просрочен!')

# День недели (0=понедельник)
print('Это', ['пн','вт','ср','чт','пт','сб','вс'][now.weekday()])

Вычитание двух дат даёт timedelta, у которого есть .days — так считают возраст счёта или просрочку. А weekday() возвращает день недели числом, что незаменимо для правил «только по будням».

АРИФМЕТИКА ВРЕМЕНИ

  datetime (момент)  +/-  timedelta (промежуток)  =  datetime
  datetime           -    datetime                =  timedelta

  '22.06.2026' --strptime--> datetime --strftime--> '22.06.2026'
       строка                 объект                  строка

В задачах автоматизации часто всплывает работа с границами периодов: «первое число месяца», «прошлый понедельник», «конец квартала». Голым datetime это считается через арифметику, но для сложных правил удобнее библиотека dateutil с её relativedelta, которая умеет «прибавить месяц» с корректным учётом разной длины месяцев. Отдельная тема — часовые пояса: если ваш сервер в одной зоне, а пользователи в другой, наивные даты без зоны приводят к ошибкам в расписании. Для таких случаев datetime хранит необязательную информацию о зоне (tzinfo), и в распределённых системах ей пренебрегать нельзя.

Как работает под капотом

Внутри datetime хранит дату и время как набор чисел (год, месяц, день, час...), а timedelta — как количество дней, секунд и микросекунд. Когда вы складываете их, Python сам разбирается с переходами через границы месяцев и високосными годами — вам не нужно помнить, сколько дней в феврале. Это и есть причина не считать даты вручную.

Пара strftime/strptime — это мост между человеком и машиной. strftime (string from time) форматирует объект в строку по шаблону с кодами %Y %m %d %H %M. strptime (string parse time) делает обратное — разбирает строку в объект, чтобы с ней можно было считать.

Частые ошибки

  • Считать дни вручную. «Прибавить 30 дней» через сложение чисел ломается на границах месяцев. Только timedelta.
  • Путать форматы strftime. %m — месяц, %M — минуты. Перепутав регистр, получите бессмыслицу.
  • Игнорировать часовые пояса. Для локальных задач это ок, но при работе с серверами в разных зонах учитывайте tzinfo.

Best practices

  • Любую арифметику дат делайте через timedelta, не вручную.
  • Для имён файлов используйте формат %Y-%m-%d — он сортируется лексикографически правильно.
  • Разбирайте входные даты через strptime сразу в datetime, чтобы дальше с ними считать.

Итоги. datetime и timedelta превращают работу с датами в простую арифметику, а strftime/strptime связывают строки и объекты. Это фундамент расписаний. Теперь научим скрипт запускаться сам в нужное время.

Проверьте себя
1. Что получится при вычитании одной datetime из другой?
AЧисло секунд
BОбъект timedelta с атрибутом .days
CСтрока с датой
DОшибка — даты нельзя вычитать
2. Чем отличаются %m и %M в strftime?
AНичем, это синонимы
B%m — месяц, %M — минуты
C%m — минуты, %M — месяц
D%m — миллисекунды, %M — месяц