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
. Их легко запомнить по последним буквам: f
— format (форматировать объект в строку), p
— parse (парсить строку в объект).
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()
Разберем этот код по шагам:
Получение текущего момента: С помощью
datetime.now()
мы получаем точную отправную точку для наших расчетов.Создание целевой даты: Мы используем конструктор
datetime(year, month, day)
, чтобы создать объект, представляющий полночь 1 января следующего года.Вычисление интервала: Вычитание одной даты из другой дает нам объект
timedelta
, который хранит в себе всю информацию о промежутке времени между ними.Анализ результата: Мы извлекаем из
timedelta
количество полных дней (.days
) и оставшиеся секунды (.seconds
). Чтобы получить из секунд часы и минуты, мы используем целочисленное деление (//
) и оператор взятия остатка (%
).
Всего в несколько строк кода мы решили поставленную задачу, продемонстрировав, насколько эффективным инструментом является модуль datetime
при правильном его использовании.
6. Заключение и следующий шаг
Подведем итоги. В рамках этого руководства мы последовательно разобрали все ключевые операции для работы со временем в Python.
Эти навыки формируют прочный фундамент для работы с временными данными. Лучший способ закрепить их — применить на практике. Для этого я подготовил для вас небольшое домашнее задание.
Домашнее задание на GitHub
В репозитории вы найдете все необходимое для начала работы и скрипт для автоматической проверки вашего решения.
Ссылка на репозиторий: Домашнее задание тут
P.S. Больше подобных разборов, полезные фрагменты кода и анонсы моих новых статей вы найдете в моем Telegram-канале. Заходите, чтобы оставаться на связи!
KonstantinTokar
Статья неполная. Время - одна из сложнейших тем в программировании. Не описана работа с временными зонами.
enamored_poc Автор
Я указал, что статья для начинающих. Планировалась 2 часть.