Два ключевых типа: date и datetime
Модуль datetime даёт тебе четыре важных вещи: date, time, datetime и timedelta. Первые три — это то, что звучит; четвёртый — промежуток времени.
date — это день: год, месяц, день, без часов. datetime — дата плюс время. Если часы не нужны, date аккуратнее.
Создаём конкретные даты
Конструируем напрямую:
Аргументы — year, month, day для date, и до year, month, day, hour, minute, second, microsecond для datetime.
Читаем поля
У каждой даты/datetime есть атрибуты:
isoformat() — твой друг для машиночитаемого вывода: даёт что-то вроде "2026-04-20T09:30:15", что другие системы однозначно распарсят.
Форматирование через strftime
Для человеко-читаемого вывода .strftime(fmt) превращает date или datetime в отформатированную строку:
Коды форматирования, которые чаще всего стоит помнить:
%Y— 4-значный год (2026)%m— номер месяца с нулём (04)%d— день месяца с нулём (20)%H/%I— час, 24/12-часовой формат%M— минута%S— секунда%A/%a— день недели полный / сокращённый (Monday / Mon)%B/%b— название месяца полное / сокращённое (April / Apr)%p— AM/PM
Заучивать не обязательно — держи справочник под рукой и подглядывай.
Парсинг через strptime
Обратная сторона: взять строку известной формы и превратить в datetime:
Формат должен точно совпадать со входом. Не совпал — strptime поднимет ValueError.
Для ISO-8601 строк (машиночитаемый стандарт) в современном Python есть более простая фишка:
Если имеешь дело с разнобоем форматов, внешний пакет dateutil (pip install python-dateutil) имеет всеядный parser.parse(), который делает разумное предположение.
Арифметика через timedelta
Для математики над датами используй timedelta — разницу или смещение:
Аргументы timedelta: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Нет months или years — у месяцев переменная длина. Для месячной/годовой математики — dateutil.relativedelta:
from dateutil.relativedelta import relativedelta
from datetime import date
today = date.today()
next_quarter = today + relativedelta(months=3)
print(next_quarter)
Таймзоны: naive vs aware
datetime без таймзоны — наивный (naive): Python не знает, какую зону он представляет. Арифметика над наивными datetime нормальна, пока сидишь в одной логической зоне; беда начинается, когда данные из разных поясов встречаются.
Aware-datetime несёт таймзону с собой. Прикрепляй её явно:
В Python 3.9 добавили модуль zoneinfo для именованных таймзон (использует системную IANA-базу):
Перевод между зонами — .astimezone():
Правило, которое стоит запомнить: храни datetime в UTC, переводи в локальные зоны только в момент отображения. Одна эта привычка отводит большинство таймзонных багов.
Timestamp
Unix-timestamp — количество секунд с 1970-01-01 UTC. Python легко конвертирует:
Timestamp-ы полезны для сравнений, сортировки и интеропа с другими системами. Для человеко-понятного вывода сначала конвертируй обратно в datetime.
Замер длительности чего-то
Для быстрых замеров — вычти два datetime:
Для более серьёзного измерения производительности — time.perf_counter(): субмикросекундное разрешение, не зависит от изменений системных часов. datetime.now() ок для чисел в духе «сколько длился этот API-вызов».
Паттерны, которые пригодятся
Что унести с собой
date,datetimeиtimedeltaпокрывают 90% нужд.- ISO-8601 — для машин,
strftime— для людей. - Храни в UTC, конвертируй при отображении.
zoneinfo— для именованных таймзон.- Для месяцев и лет —
dateutil.relativedelta.
Ещё один инструмент в твой реальный арсенал — регулярные выражения, дальше.
Часто задаваемые вопросы
Как получить текущую дату и время в Python?
datetime.now() возвращает текущие локальные дату и время. datetime.utcnow() — UTC (но современное предпочтение — datetime.now(timezone.utc), потому что utcnow() возвращает naive-datetime). Только дата — date.today().
Как отформатировать дату в строку?
Используй .strftime(format) с кодами форматирования вроде %Y-%m-%d для год-месяц-день. Пример: datetime.now().strftime('%Y-%m-%d %H:%M'). Обратно — datetime.strptime(text, format) с теми же кодами.
Как добавить дни к дате в Python?
Используй timedelta: from datetime import date, timedelta; date.today() + timedelta(days=7). timedelta поддерживает дни, часы, минуты, секунды, недели и больше. Для месячной и годовой арифметики — внешний dateutil.relativedelta; timedelta про месяцы не знает.