Дата и время в Python: упражнения с решениями
Работа с датой и временем в Python строится на модуле datetime, и лучше всего ее закрепляет практика на типовых задачах. Ниже 13 упражнений с решениями: вывод текущего времени, перевод строки в дату и обратно, сложение и вычитание интервалов, дни недели и разница между датами. Каждое решение проверено на Python 3.12.

Содержание статьи
Что пригодится для решения
В модуле datetime четыре основных класса: date хранит дату, time время суток, datetime дату вместе со временем, timedelta интервал между двумя моментами. Подробный разбор классов есть в статье про модуль datetime, здесь только то, что нужно для задач.
Перевод даты в строку делает метод strftime(), обратный перевод datetime.strptime(). Оба используют одни и те же коды формата.
| Код | Значение | Пример |
|---|---|---|
%Y | Год из четырех цифр | 2020 |
%m | Месяц с ведущим нулем | 02 |
%d | День месяца | 25 |
%H / %I | Час в 24- и 12-часовом формате | 16 / 04 |
%M, %S | Минуты и секунды | 20, 00 |
%p | AM или PM | PM |
%A / %a | День недели полностью и кратко | Tuesday / Tue |
%B / %b | Месяц полностью и кратко | February / Feb |
Названия дней и месяцев выводятся на языке текущей локали. В стандартной локали C, которая включена по умолчанию, они английские.
Текущее время и вывод дат
В этих упражнениях дата уже есть, задача в том, чтобы получить ее или показать в нужном виде.
Упражнение 1: Вывести текущую дату и время
Выведите текущие дату и время, а отдельной строкой только время. Затем получите то же самое через модуль time.
Решение:
from datetime import datetime
now = datetime.now()
print(now) # 2026-10-31 14:05:12.483920
print(now.time()) # 14:05:12.483920
print(now.strftime("%d.%m.%Y %H:%M")) # 31.10.2026 14:05Второй способ через модуль time. Функция localtime() возвращает местное время, gmtime() время по UTC.
from time import localtime, strftime
print(strftime("%Y-%m-%d %H:%M:%S", localtime()))Упражнение 2: Текущее время в миллисекундах
Получите количество миллисекунд, прошедших с 1 января 1970 года (Unix-время).
Решение:
import time
ms = time.time_ns() // 1_000_000
print(ms) # 1793455512483Вариант int(time.time() * 1000) тоже работает, но time_ns() возвращает целое число наносекунд и не теряет точность на преобразовании float. Другие функции для замеров собраны в статье про модуль time.
Упражнение 3: Дата в виде строки
Дано given_date = datetime(2020, 2, 25). Получите строку "2020-02-25 00:00:00".
Решение:
from datetime import datetime
given_date = datetime(2020, 2, 25)
print(given_date.strftime("%Y-%m-%d %H:%M:%S")) # 2020-02-25 00:00:00
print(str(given_date)) # тот же результатУпражнение 4: Формат с днем недели и месяцем
Для той же даты выведите строку вида "Tuesday 25 February 2020": день недели, число, название месяца, год.
Решение:
from datetime import datetime
given_date = datetime(2020, 2, 25)
print(given_date.strftime("%A %d %B %Y")) # Tuesday 25 February 2020Строки в объекты datetime
Обратная задача: дата пришла из файла, формы или API строкой, и ее нужно превратить в объект, с которым можно считать. Формат строки при этом нужно описать точно, иначе strptime() выдаст ValueError.
Упражнение 5: Разбор строки с AM и PM
Дана строка "Feb 25 2020 4:20PM". Преобразуйте ее в объект datetime, ожидаемый результат 2020-02-25 16:20:00.
Решение:
from datetime import datetime
date_string = "Feb 25 2020 4:20PM"
dt = datetime.strptime(date_string, "%b %d %Y %I:%M%p")
print(dt) # 2020-02-25 16:20:00Час здесь в 12-часовом формате, поэтому нужен %I, а не %H, и обязательно %p. Без него 4:20PM превратится в 04:20. Больше примеров форматов в статье про strptime.
Упражнение 6: Строка в формате ISO
Дана строка "2024-03-15T09:30:00" из JSON-ответа сервера. Получите объект datetime и выведите только час.
Решение:
from datetime import datetime
dt = datetime.fromisoformat("2024-03-15T09:30:00")
print(dt.hour) # 9
print(dt.isoformat()) # 2024-03-15T09:30:00Для формата ISO 8601 метод fromisoformat() проще и быстрее, чем strptime(): шаблон писать не нужно. С Python 3.11 он понимает и суффикс Z для UTC.
Сложение, вычитание и разница дат
Интервалы описывает класс timedelta. Его можно прибавлять к дате и вычитать из нее, а разность двух дат сама дает timedelta. Наибольшая единица в timedelta - неделя, месяцев и лет в нем нет.
Упражнение 7: Вычесть неделю из даты
Дано datetime(2020, 2, 25). Получите дату на 7 дней раньше, ожидается 2020-02-18.
Решение:
from datetime import datetime, timedelta
given_date = datetime(2020, 2, 25)
print(given_date - timedelta(days=7)) # 2020-02-18 00:00:00
print(given_date - timedelta(weeks=1)) # то же самоеУпражнение 8: Прибавить неделю и 12 часов
Дано datetime(2020, 3, 22, 10, 0, 0). Прибавьте 7 дней и 12 часов, ожидается 2020-03-29 22:00:00.
Решение:
from datetime import datetime, timedelta
given_date = datetime(2020, 3, 22, 10, 0, 0)
print(given_date + timedelta(days=7, hours=12)) # 2020-03-29 22:00:00Упражнение 9: Прибавить 4 месяца
Дано date(2020, 2, 25). Получите дату через 4 месяца, ожидается 2020-06-25.
Решение:
Месяцы бывают разной длины, поэтому timedelta здесь не подходит. Удобнее всего relativedelta из сторонней библиотеки python-dateutil (устанавливается командой pip install python-dateutil). Она сама корректирует день: 31 января плюс месяц даст 29 февраля в високосный год.
from datetime import date
from dateutil.relativedelta import relativedelta
given_date = date(2020, 2, 25)
print(given_date + relativedelta(months=4)) # 2020-06-25
print(date(2020, 1, 31) + relativedelta(months=1)) # 2020-02-29Упражнение 10: Количество дней между датами
Даны даты 2020-02-25 и 2020-09-17. Найдите, сколько дней между ними, ожидается 205.
Решение:
from datetime import date
date_1 = date(2020, 2, 25)
date_2 = date(2020, 9, 17)
delta = abs(date_2 - date_1)
print(delta.days) # 205Функция abs() избавляет от проверки, какая дата больше: разность в обратном порядке дала бы отрицательный интервал. Другие операции с интервалами разобраны в статье про timedelta.
Упражнение 11: Дата через N рабочих дней
Напишите функцию, которая возвращает дату через n рабочих дней от заданной, пропуская субботы и воскресенья. Праздники не учитываются.
Решение:
from datetime import date, timedelta
def add_workdays(start, n):
current = start
while n > 0:
current += timedelta(days=1)
if current.weekday() < 5: # 0-4: понедельник-пятница
n -= 1
return current
print(add_workdays(date(2024, 3, 15), 3)) # 2024-03-20Дни недели и календарь
Методы weekday() и isoweekday() возвращают номер дня недели. В первом понедельник равен 0, а воскресенье 6, во втором понедельник 1, а воскресенье 7. Путаница между ними частая причина ошибок на единицу.
Упражнение 12: День недели для даты
Дано datetime(2020, 7, 26). Выведите номер дня недели и его название, ожидается Sunday.
Решение:
import calendar
from datetime import datetime
given_date = datetime(2020, 7, 26)
print(given_date.weekday()) # 6
print(given_date.strftime("%A")) # Sunday
print(calendar.day_name[given_date.weekday()]) # SundayДля русских названий без смены локали проще завести свой список: days = ["понедельник", "вторник", ...] и брать days[given_date.weekday()].
Упражнение 13: Високосный год и дни до Нового года
Для текущей даты определите, високосный ли год, и сколько дней осталось до 1 января следующего года.
Решение:
import calendar
from datetime import date
today = date.today()
print(calendar.isleap(today.year))
new_year = date(today.year + 1, 1, 1)
print((new_year - today).days)Без модуля calendar год проверяется по правилу: делится на 4 и не делится на 100, либо делится на 400. Поэтому 2000 год високосный, а 1900 нет.
Частые вопросы
Ответы на вопросы, которые возникают при решении задач с датами.
Чем datetime.now() отличается от datetime.today()?
Без аргументов оба возвращают местное время. Разница в том, что now() принимает часовой пояс: datetime.now(timezone.utc) вернет время UTC с указанием пояса. Метод utcnow() с Python 3.12 объявлен устаревшим, вместо него используют именно этот вариант.
Как вывести название месяца по-русски?
Можно установить локаль через locale.setlocale(locale.LC_TIME, "ru_RU.UTF-8"), но она должна быть доступна в системе, а смена локали действует на всю программу. Надежнее хранить список названий месяцев в коде и выбирать по dt.month - 1.
Почему нельзя сравнить date и datetime?
Сравнение объектов date и datetime вызывает TypeError, потому что у одного есть время, а у другого нет. Приведите их к одному типу: dt.date() отбрасывает время у datetime.
Как получить разницу дат в часах или минутах?
У timedelta есть атрибуты days, seconds и метод total_seconds(). Часы считаются как delta.total_seconds() / 3600. Атрибут seconds содержит только остаток внутри суток, поэтому для полного интервала он не подходит.