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
В репозитории вы найдете все необходимое для начала работы и скрипт для автоматической проверки вашего решения.
Ссылка на репозиторий: Домашнее задание тут
Анонс новых статей, полезные материалы, а так же если в процессе решения возникнут сложности, обсудить их или задать вопрос по статье можно в моём Telegram-сообществе.
