Python: уроки, справочник и задачи

Дата и время в Python: упражнения с решениями

Раздел: Модули и библиотеки Python · Обновлено 31.10.2026

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

Python дата и время
Фото: Uoaei1 / CC BY-SA 4.0, Wikimedia Commons
Содержание статьи
  1. Что пригодится для решения
  2. Текущее время и вывод дат
  3. Строки в объекты datetime
  4. Сложение, вычитание и разница дат
  5. Дни недели и календарь
  6. Частые вопросы

Что пригодится для решения

В модуле 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
%pAM или PMPM
%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 содержит только остаток внутри суток, поэтому для полного интервала он не подходит.