Работа с датами и временем
Расписание невозможно без работы с датами. Модуль 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 связывают строки и объекты. Это фундамент расписаний. Теперь научим скрипт запускаться сам в нужное время.