1. Введение

Модуль datetime — один из тех инструментов в стандартной библиотеке Python, с которым рано или поздно сталкивается каждый начинающий разработчик. Он предоставляет мощный, но в то же время интуитивно понятный интерфейс для работы с датами и временем.

Цель этой статьи — помочь вам научиться основам работы с datetime. Мы последовательно разберем ключевые операции, чтобы вы могли уверенно решать базовые задачи, связанные со временем: будь то обработка логов, расчет временных интервалов или работа с датами из API.

В этой статье мы последовательно изучим:

  • Как получать текущую дату и время.

  • Как выполнять арифметические операции: прибавлять и вычитать дни, часы и минуты.

  • Как преобразовывать строки в объекты дат (strptime) и обратно (strftime) — самый важный навык для работы с внешними данными.

Мы пройдем путь от основ до практических примеров, а в конце вас будет ждать домашнее задание на GitHub для закрепления полученных навыков. Давайте начнем.

2. Разбираемся с date, time и datetime

Прежде чем выполнять операции со временем, необходимо понять, с какими типами данных мы будем работать. Модуль datetime предоставляет несколько основных классов для представления временных данных. Они являются неизменяемыми (immutable), что делает их предсказуемыми и безопасными для использования. Рассмотрим три ключевых из них.

datetime.date — только дата

Это объект, который хранит только дату: год, месяц и день. Он инкапсулирует в себе три атрибута: year, month и day. Этот класс идеально подходит, когда информация о времени суток не имеет значения или отсутствует, например, при работе с днями рождения, праздниками или сроками, измеряемыми в днях.

Пример создания и использования date:

from datetime import date

# Создаем объект, представляющий 5 октября 2025 года
d = date(2025, 10, 5)

print(f"Объект date: {d}")
print(f"Год: {d.year}")
print(f"Месяц: {d.month}")
print(f"День: {d.day}")

# Также можно получить день недели (0 - понедельник, 6 - воскресенье)
print(f"День недели (weekday): {d.weekday()}") 

datetime.time — только время

Этот объект представляет время суток, изолированное от какой-либо конкретной даты. Он хранит hour, minute, second, microsecond. Используется, когда дата не важна, а значение имеет только конкретный момент в течение дня, например, для определения времени открытия/закрытия сервиса или установки ежедневного дедлайна.

Пример создания и использования time:

from datetime import time

# Создаем объект, представляющий время 16:30
t = time(16, 30, 0)

print(f"\nОбъект time: {t}")
print(f"Час: {t.hour}")
print(f"Минуты: {t.minute}")
print(f"Секунды: {t.second}")

datetime.datetime — дата и время вместе

Это наиболее полный и часто используемый класс, который объединяет в себе информацию как из date, так и из time. Он хранит все атрибуты: от года до микросекунд. Подавляющее большинство операций, связанных с временными метками (timestamps), логами или точными событиями, используют именно этот объект.

Хотя мы можем создавать объекты datetime вручную, указывая все компоненты, самая частая операция — это получение текущего момента.

Практический блок: Создание и разбор объекта datetime

Для получения текущего локального времени используется метод .now(). Он возвращает готовый объект datetime, который мы можем "разобрать" на части.

from datetime import datetime

# Создадим объект вручную для конкретного момента
dt_manual = datetime(2025, 9, 26, 18, 0, 0)
print(f"\nСозданный вручную объект datetime: {dt_manual}")

# Получаем текущую локальную дату и время
now = datetime.now()
print(f"Полный объект datetime (now): {now}")
# Вывод: Полный объект datetime (now): 2025-09-26 10:35:15.486213

# Из этого объекта мы можем легко извлечь отдельные компоненты:
print(f"Год: {now.year}")
print(f"Месяц: {now.month}")
print(f"День: {now.day}")
print(f"Час: {now.hour}")
print(f"Минуты: {now.minute}")
print(f"Секунды: {now.second}")

Как видите, мы можем как создавать объекты для произвольного момента времени, так и получать текущий. Доступ к атрибутам (.year, .month и т.д.) позволяет использовать эти данные в дальнейшей логике программы.

Итак, мы разобрались с тремя основными типами данных. Теперь, когда мы понимаем, как создавать и "разбирать" на части эти объекты, мы можем перейти к самому интересному — выполнению с ними математических операций.

3. Сложение и вычитание дат (timedelta)

Просто получить текущую дату — это только полдела. Основная мощь datetime раскрывается, когда мы начинаем выполнять с датами арифметические операции: вычислять будущие или прошедшие моменты времени, а также определять интервалы между двумя событиями.

Для этих целей в модуле datetime существует специальный класс — timedelta. Объект timedelta представляет собой не конкретный момент времени, а длительность или разницу между двумя датами. Эта длительность может быть выражена в днях, секундах и микросекундах.

Практический блок

Давайте посмотрим, как использовать timedelta для навигации по временной шкале. Сначала создадим объект datetime и прибавим к нему некоторый интервал.

from datetime import datetime, timedelta

now = datetime.now()
print(f"Текущий момент: {now}")

# Создадим интервал в 15 дней и 3 часа
delta = timedelta(days=15, hours=3)

# Узнаем, какая дата будет через этот интервал
future_date = now + delta
print(f"Через 15 дней и 3 часа: {future_date}")

# Аналогично можно вычесть интервал, чтобы узнать прошедшую дату
past_date = now - delta
print(f"15 дней и 3 часа назад: {past_date}")

Другой ключевой сценарий — вычисление разницы между двумя объектами datetime. Результатом такой операции как раз и будет объект timedelta. Это именно то, что нам нужно для решения нашей финальной задачи — расчета времени до Нового года.

from datetime import datetime

# Текущий момент
today = datetime.now()

# Создадим объект datetime для конкретной будущей даты 
# (1 января следующего года)
new_year = datetime(today.year + 1, 1, 1)

# Вычисляем разницу
time_left = new_year - today

print(f"Тип объекта time_left: {type(time_left)}")
print(f"До Нового года осталось: {time_left}")

# У объекта timedelta есть полезные атрибуты для доступа к данным
print(f"Дней: {time_left.days}")
print(f"Секунд: {time_left.seconds}")

Обратите внимание на вывод: результат вычитания — это объект timedelta, который хранит разницу в днях и секундах. Атрибут .days содержит количество полных суток в интервале, а .seconds — оставшееся количество секунд (от 0 до 86399).

Таким образом, timedelta является ключевым инструментом для любых вычислений, связанных с временными интервалами. Теперь, когда мы умеем создавать даты и выполнять с ними математические операции, остался последний важный шаг: научиться преобразовывать их в строки и обратно для взаимодействия с другими системами.

4. Форматы времени: Как подружить строки и даты (strftime и strptime)

В реальных системах данные редко существуют в виде "чистых" объектов datetime. Они поступают извне — из файлов, баз данных, ответов API или пользовательского ввода — и почти всегда в виде строк. Точно так же, когда мы выводим информацию для пользователя или сохраняем ее, нам требуется представить datetime объект в виде строки определенного формата.

Для этого двунаправленного преобразования в datetime существуют два мощных метода: strftime и strptime. Их легко запомнить по последним буквам: fformat (форматировать объект в строку), pparse (парсить строку в объект).

strftime: Преобразование объекта datetime в строку

Метод strftime (string format time) вызывается у объекта datetime и принимает на вход строку с кодами форматирования. Эти коды определяют, как будет выглядеть итоговая текстовая строка.

Рассмотрим наиболее часто используемые коды:

  • %Y — Год с веком (например, 2025)

  • %m — Номер месяца с ведущим нулем (от 01 до 12)

  • %d — День месяца с ведущим нулем (от 01 до 31)

  • %H — Час в 24-часовом формате (от 00 до 23)

  • %M — Минута (от 00 до 59)

  • %S — Секунда (от 00 до 61)

Практический блок: Готовим дату для вывода

from datetime import datetime

now = datetime.now()

# Пример 1: Формат, принятый в России (ДД.ММ.ГГГГ ЧЧ:ММ)
formatted_string_ru = now.strftime("%d.%m.%Y %H:%M")
print(f"Русский формат: {formatted_string_ru}")

# Пример 2: Формат ISO 8601, часто используемый в API
formatted_string_iso = now.strftime("%Y-%m-%dT%H:%M:%S")
print(f"Формат ISO: {formatted_string_iso}")

# Пример 3: Более человекочитаемый формат
# Для корректного вывода названий на русском может потребоваться настройка локали
# import locale
# locale.setlocale(locale.LC_TIME, 'ru_RU.UTF-8')
# now.strftime("%A, %d %B %Y г.")

strptime: Преобразование строки в объект datetime

Метод strptime (string parse time) решает обратную задачу. Он является статическим методом класса datetime и принимает два аргумента: исходную строку с датой и строку с кодами форматирования, которая в точности описывает структуру исходной строки.

Это критически важная операция при работе с любыми внешними данными.

Практический блок: Читаем дату из текстового представления

from datetime import datetime

date_string_from_api = "2025-10-20 15:00:00"
date_string_from_file = "20.10.2025"

# Парсим строку из "API"
# Формат "%Y-%m-%d %H:%M:%S" точно соответствует строке
dt_object_1 = datetime.strptime(date_string_from_api, "%Y-%m-%d %H:%M:%S")

print(f"Строка: '{date_string_from_api}'")
print(f"Объект datetime: {dt_object_1}")
print(f"Год из объекта: {dt_object_1.year}")


# Парсим строку из "файла"
dt_object_2 = datetime.strptime(date_string_from_file, "%d.%m.%Y")

print(f"\nСтрока: '{date_string_from_file}'")
print(f"Объект datetime: {dt_object_2}")
# Обратите внимание: так как время не было указано, оно будет установлено в 00:00:00

Освоив strftime и strptime, вы получаете полный контроль над представлением временных данных. Вы можете как генерировать строки любого требуемого формата, так и надежно парсить практически любые текстовые данные о времени, превращая их в полноценные объекты datetime, готовые для дальнейших вычислений.

Теперь, когда мы изучили все ключевые компоненты модуля, мы готовы объединить их для решения нашей финальной задачи.

5. Финальный проект: Собираем все вместе

В начале этого руководства мы поставили перед собой цель — научиться решать практические задачи с помощью модуля datetime. Теперь, когда мы рассмотрели все необходимые инструменты, пришло время объединить их для решения нашей финальной задачи.

Задача: Написать скрипт, который вычисляет точное время (дни, часы, минуты), оставшееся до наступления следующего Нового года.

Этот пример — отличная демонстрация того, как изученные нами концепции — создание объектов datetime, вычисление timedelta и форматирование вывода — объединяются в единое целое для решения реальной проблемы.

Практический блок: Скрипт для обратного отсчета

Вот полный код скрипта, решающего поставленную задачу:

from datetime import datetime

def get_time_until_new_year():
    """
    Вычисляет и выводит время, оставшееся до следующего Нового года.
    """
    # 1. Получаем текущую дату и время — наша отправная точка.
    now = datetime.now()
    print(f"Текущая дата и время: {now.strftime('%d.%m.%Y %H:%M')}")

    # 2. Определяем целевую дату — следующий Новый год.
    # Мы берем текущий год, прибавляем 1, и устанавливаем 1-е января, 00:00:00.
    new_year_date = datetime(now.year + 1, 1, 1)

    # 3. Вычисляем разницу между датами, получая объект timedelta.
    time_left = new_year_date - now

    # 4. Извлекаем данные из объекта timedelta и форматируем для вывода.
    days = time_left.days
    hours = time_left.seconds // 3600  # Получаем целые часы из остатка секунд
    minutes = (time_left.seconds % 3600) // 60 # Получаем минуты из остатка

    print(f"До Нового {new_year_date.year} года осталось: {days} дней, {hours} часов и {minutes} минут.")

# Запускаем нашу функцию
get_time_until_new_year()

Разберем этот код по шагам:

  1. Получение текущего момента: С помощью datetime.now() мы получаем точную отправную точку для наших расчетов.

  2. Создание целевой даты: Мы используем конструктор datetime(year, month, day), чтобы создать объект, представляющий полночь 1 января следующего года.

  3. Вычисление интервала: Вычитание одной даты из другой дает нам объект timedelta, который хранит в себе всю информацию о промежутке времени между ними.

  4. Анализ результата: Мы извлекаем из timedelta количество полных дней (.days) и оставшиеся секунды (.seconds). Чтобы получить из секунд часы и минуты, мы используем целочисленное деление (//) и оператор взятия остатка (%).

Всего в несколько строк кода мы решили поставленную задачу, продемонстрировав, насколько эффективным инструментом является модуль datetime при правильном его использовании.

6. Заключение и следующий шаг

Подведем итоги. В рамках этого руководства мы последовательно разобрали все ключевые операции для работы со временем в Python.

Эти навыки формируют прочный фундамент для работы с временными данными. Лучший способ закрепить их — применить на практике. Для этого я подготовил для вас небольшое домашнее задание.

Домашнее задание на GitHub

В репозитории вы найдете все необходимое для начала работы и скрипт для автоматической проверки вашего решения.

Ссылка на репозиторий: Домашнее задание тут

P.S. Больше подобных разборов, полезные фрагменты кода и анонсы моих новых статей вы найдете в моем Telegram-канале. Заходите, чтобы оставаться на связи!

Мой Python-канал

Комментарии (2)


  1. KonstantinTokar
    27.09.2025 03:49

    Статья неполная. Время - одна из сложнейших тем в программировании. Не описана работа с временными зонами.


    1. enamored_poc Автор
      27.09.2025 03:49

      Я указал, что статья для начинающих. Планировалась 2 часть.