В современном программировании работа с датой и временем — одна из самых частых задач. Представьте, что вы пишете приложение для заметок и хотите показывать, когда была создана каждая заметка. Или разрабатываете календарь событий, где нужно напоминать о встречах. Или создаёте финансовый отчёт, где нужно вычислить количество дней между транзакциями. Или пишете планировщик задач, который запускает скрипты по расписанию. Во всех этих случаях вам нужно уметь получать текущее время, создавать объекты с датами, сравнивать их, форматировать для вывода пользователю и парсить из пользовательского ввода. В Python для всех этих задач существует модуль datetime — мощный и гибкий инструмент, входящий в стандартную библиотеку. Он не требует установки дополнительных пакетов и предоставляет всё необходимое для работы с датами, временем, интервалами и даже часовыми поясами.
В этом уроке мы подробно изучим модуль datetime с нуля. Вы узнаете, какие классы входят в модуль и для чего каждый из них предназначен. Класс date отвечает только за дату (год, месяц, день) без привязки ко времени — идеально для дней рождения, календарных событий без конкретного времени. Класс time представляет время (часы, минуты, секунды, микросекунды) без даты — подходит для хранения времени начала рабочего дня или длительности. Класс datetime объединяет дату и время — это самый универсальный и часто используемый класс, когда нужно зафиксировать конкретный момент. Класс timedelta представляет разницу между двумя датами или временами (интервал) — с его помощью можно вычислять, сколько дней прошло между событиями, или прибавлять 30 дней к текущей дате. Класс tzinfo (и его реализации из модулей zoneinfo или pytz) отвечает за часовые пояса — без него невозможно правильно работать с временем в международных проектах.
Мы научимся создавать объекты даты и времени разными способами. Через конструкторы: date(2024, 12, 25) для создания конкретной даты, datetime(2024, 12, 25, 10, 30, 0) для создания момента. Через класс-методы: date.today() для текущей даты, datetime.now() для текущих даты и времени, datetime.utcnow() для текущего времени в UTC. Через парсинг строк с помощью strptime() — когда дата приходит от пользователя или из внешнего API в виде строки. Вы узнаете, как получать текущую дату и время, как извлекать отдельные компоненты (год, месяц, день, час, минуту, секунду), как сравнивать даты между собой (какая раньше, какая позже, равны ли они).
Особое внимание уделим форматированию дат для вывода пользователю. Метод strftime() (string format time) преобразует объект даты или времени в строку по заданному формату. Это позволяет представить дату в любом удобном виде: "25.12.2024", "2024-12-25 10:30:00", "25 декабря 2024 года", "Tuesday, 25 December 2024". Вы изучите все основные коды форматирования: %Y для года из 4 цифр (2024), %y для года из 2 цифр (24), %m для месяца с ведущим нулем (01-12), %B для полного названия месяца (December), %b для сокращённого (Dec), %d для дня месяца с ведущим нулем (01-31), %H для часа в 24-часовом формате (00-23), %I для часа в 12-часовом формате (01-12), %p для AM/PM, %M для минуты (00-59), %S для секунды (00-59), %A для полного названия дня недели (Tuesday), %a для сокращённого (Tue), %j для дня года (001-366). Научимся создавать локализованные даты на русском языке с помощью подстановки названий месяцев и дней недели.
Противоположная операция — парсинг даты из строки — выполняется с помощью strptime() (string parse time). Это незаменимо при обработке пользовательского ввода (пользователь ввёл дату в поле формы) или данных из внешних источников (API вернуло дату в формате JSON, файл лога содержит временные метки). Вы узнаете, как преобразовать строку "25.12.2024" в объект date, как обрабатывать разные форматы дат ("2024-12-25", "25/12/2024", "Dec 25 2024"), как извлекать время из строки, и как правильно обрабатывать ошибки парсинга, когда строка не соответствует ожидаемому формату или содержит несуществующую дату (например, 30 февраля).
Работа с интервалами времени — ключевая возможность timedelta. Вы научитесь вычислять разницу между датами: date1 - date2 возвращает объект timedelta, из которого можно получить количество дней, секунд и микросекунд разницы. Вы узнаете, как прибавлять и вычитать интервалы к датам: date + timedelta(days=30) даст дату через 30 дней, date - timedelta(weeks=2) — дату на 2 недели раньше. timedelta поддерживает дни, секунды, микросекунды, миллисекунды, минуты, часы и недели. Это позволяет решать практические задачи: найти дату окончания отпуска, определить, сколько дней осталось до дня рождения, вычислить возраст человека в днях, создать календарь напоминаний.
Отдельный раздел посвящен работе с часовыми поясами. Вы узнаете, что такое «наивные» (naive) datetime — объекты, которые не содержат информации о часовом поясе, и «осведомленные» (aware) datetime — объекты, которые знают о своём часовом поясе. Для работы с часовыми поясами в Python 3.9+ используется модуль zoneinfo из стандартной библиотеки: ZoneInfo("Europe/Moscow") создаёт объект часового пояса Москвы. Для более старых версий Python используется сторонняя библиотека pytz. Вы научитесь получать текущее время в UTC, преобразовывать время между часовыми поясами с помощью метода .astimezone(), и поймёте, почему важно всегда хранить время в UTC и преобразовывать в локальное только при отображении пользователю.
Все примеры будут максимально практичными и приближенными к реальным задачам: логирование событий с временными метками в формате ISO, калькулятор возраста по дате рождения с точностью до дней, расчёт количества дней до Нового года, календарь событий с напоминаниями, обработка пользовательского ввода даты рождения, планировщик задач с проверкой времени выполнения, преобразование времени из одного часового пояса в другой для международных конференций. К концу урока вы будете уверенно работать с датами и временем в Python — навык, необходимый для любого приложения, от простых скриптов до сложных веб-сервисов и систем обработки данных.