Python: работа с датой и временем
Пять минут на эту статью — и «Python: работа с датой и временем» станет понятнее. Внутри: теория без воды, пример, разбор задания и чек-лист самопроверки.
Зачем в Python нужны дата и время
Дата и время встречаются в школьных проектах, олимпиадных задачах и экзаменационных программах: нужно узнать день недели, посчитать разницу между событиями или вывести дату в понятном виде. Ошибка в одном символе часто меняет результат: 03.04 может означать 3 апреля или 4 марта. В Python для таких задач есть модуль datetime. Он помогает не считать дни вручную, учитывать длину месяцев и удобно сравнивать моменты времени.
Главная идея проста: дату, время и их сочетание лучше хранить не как обычную строку, а как специальный объект. Тогда Python сможет выполнять с ними арифметические действия и проверки.
from datetime import date, datetime, time, timedelta
\( today = date.today() \)
print(today)
Функция date.today() возвращает сегодняшнюю дату. Если нужно получить текущие дату и время, используют datetime.now(). А для отдельного времени создают объект time.
Три основных объекта
Объект date содержит год, месяц и день. Его удобно применять, когда часы и минуты не важны. Объект time хранит часы, минуты, секунды и микросекунды. Объект datetime объединяет дату и время.
\( birthday = date(2010, 9, 18) \)
\( lesson = time(14, 30) \)
\( meeting = datetime(2025, 9, 18, 14, 30) \)
Нумерация месяцев начинается с единицы: январь — 1, декабрь — 12. Это отличается от индексов списков, где отсчёт начинается с нуля. У объекта даты можно получить отдельные части через свойства year, month и day.
print(birthday.year)
print(birthday.month)
print(birthday.day)
Создавая дату из данных пользователя, проверяй их заранее. Например, месяца 13 не существует, поэтому Python сообщит об ошибке ValueError.
В задачах сначала выпиши, что именно хранится: только день, только время или оба значения. Такой короткий шаг помогает выбрать правильный тип и не запутаться в методах.
Разность дат и промежутки времени
Для прибавления или вычитания дней применяют объект timedelta. Он может хранить дни, секунды, недели и другие единицы. Результат операции с двумя датами тоже будет промежутком времени — объектом timedelta.
\( start = date(2025, 5, 20) \)
\( end = date(2025, 6, 3) \)
\( difference = end - start \)
print(difference.days)
\( print(start + timedelta(days=7)) \)
В примере разность равна 14 дням, а прибавление недели переносит дату на 27 мая. Не нужно вручную учитывать, сколько дней в каждом месяце: модуль сделает это сам.
Для сравнения даты используют обычные операторы: <, >, ==. Дату можно проверить условием, например определить, наступил ли срок сдачи проекта. Если важны часы и минуты, вычитай объекты datetime, а не отдельные строки.
Бесплатно потренировать такие операции можно в личном кабинете с заданиями: после решения сразу легче заметить, где перепутаны дата и длительность.
Форматирование и чтение строк
Пользователь обычно видит дату в виде строки, например 18.09.2025, но Python не воспринимает её автоматически как объект даты. Для преобразования используют strptime, а для обратного вывода — strftime. В шаблоне указывают специальные обозначения.
| Обозначение | Что означает | Пример |
|---|---|---|
%d | день с двумя цифрами | 18 |
%m | номер месяца | 09 |
%Y | год из четырёх цифр | 2025 |
%H:%M | часы и минуты | 14:30 |
text = "18.09.2025"
day = datetime.strptime(text, "%d.%m.%Y").date()
print(day.strftime("%Y-%m-%d"))
Важно: шаблон должен точно соответствовать строке. Если в тексте стоит дефис, а в шаблоне точка, преобразование не сработает.
Типичные ошибки в задачах
Первая ошибка — сравнивать даты как строки. Иногда строковое сравнение случайно даёт верный результат, если используется формат «год-месяц-день», но для записи «день.месяц.год» это ненадёжно. Сначала преобразуй строки в date или datetime.
Вторая ошибка — забывать скобки у функций. date.today означает ссылку на функцию, а date.today() действительно вызывает её и возвращает дату.
Третья ошибка — путать количество дней и номер дня недели. Свойство day возвращает число месяца, а метод weekday() возвращает номер дня недели: понедельник имеет индекс 0, воскресенье — 6.
\( d = date(2025, 9, 18) \)
print(d.day)
print(d.weekday())
Четвёртая ошибка — смешивать наивные даты и часовые пояса. В базовых школьных задачах достаточно datetime без часового пояса, но в реальных приложениях время из разных стран требует отдельной настройки.
Не прибавляй к дате число напрямую: выражение date(2025, 1, 1) + 5 вызовет ошибку. Используй timedelta(days=5), потому что Python должен понимать единицу измерения.
Что запомнить
Для календарной даты используй date, для часов — time, для даты вместе со временем — datetime. Чтобы прибавить или вычесть промежуток, применяй timedelta. Разность двух дат даёт число дней через свойство days. Строки преобразуются методом strptime, а готовые объекты выводятся в нужном виде через strftime.
Перед решением задачи определи три вещи: какие данные даны, в каком они формате и что требуется получить — дату, время или промежуток. Затем проверь границы: конец месяца, новый год и правильность шаблона.
Следующий шаг — зарегистрируйся и реши 5 заданий бесплатно в личном кабинете. Практика покажет, где именно возникает ошибка: при создании объекта, вычислении разности или форматировании.
Как закрепить тему после разбора?
Реши несколько задач трёх типов: создай дату, найди промежуток между двумя датами и преобразуй строку заданного формата. После каждого решения проверь крайние случаи: последний день месяца, переход через год и время с нулевыми минутами.
Чем отличаются date и datetime?
date хранит только год, месяц и день, а datetime дополнительно содержит часы, минуты и секунды.
Как узнать день недели?
Вызови метод weekday(). Он возвращает число от 0 для понедельника до 6 для воскресенья.
Можно ли складывать две даты?
Нет. Две даты можно сравнивать и вычитать. Для прибавления к дате используй timedelta, который задаёт длительность.
Не оставляйте тему «прочитанной»
Понимание — половина дела. Вторая — практика с обратной связью: личный кабинет Просто Урок покажет, где вы ошибаетесь, и подтянет слабые места.