Menu
Русский

Python datetime: даты, время, timedelta и часовые пояса

Практический обзор модуля datetime в Python — парсинг, форматирование, арифметика над датами и работа с таймзонами без блужданий.

Два ключевых типа: date и datetime

Модуль datetime даёт тебе четыре важных вещи: date, time, datetime и timedelta. Первые три — это то, что звучит; четвёртый — промежуток времени.

main.py
Output
Click Run to see the output here.

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

Создаём конкретные даты

Конструируем напрямую:

main.py
Output
Click Run to see the output here.

Аргументы — year, month, day для date, и до year, month, day, hour, minute, second, microsecond для datetime.

Читаем поля

У каждой даты/datetime есть атрибуты:

main.py
Output
Click Run to see the output here.

isoformat() — твой друг для машиночитаемого вывода: даёт что-то вроде "2026-04-20T09:30:15", что другие системы однозначно распарсят.

Форматирование через strftime

Для человеко-читаемого вывода .strftime(fmt) превращает date или datetime в отформатированную строку:

main.py
Output
Click Run to see the output here.

Коды форматирования, которые чаще всего стоит помнить:

  • %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:

main.py
Output
Click Run to see the output here.

Формат должен точно совпадать со входом. Не совпал — strptime поднимет ValueError.

Для ISO-8601 строк (машиночитаемый стандарт) в современном Python есть более простая фишка:

main.py
Output
Click Run to see the output here.

Если имеешь дело с разнобоем форматов, внешний пакет dateutil (pip install python-dateutil) имеет всеядный parser.parse(), который делает разумное предположение.

Арифметика через timedelta

Для математики над датами используй timedelta — разницу или смещение:

main.py
Output
Click Run to see the output here.

Аргументы 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 несёт таймзону с собой. Прикрепляй её явно:

main.py
Output
Click Run to see the output here.

В Python 3.9 добавили модуль zoneinfo для именованных таймзон (использует системную IANA-базу):

main.py
Output
Click Run to see the output here.

Перевод между зонами — .astimezone():

main.py
Output
Click Run to see the output here.

Правило, которое стоит запомнить: храни datetime в UTC, переводи в локальные зоны только в момент отображения. Одна эта привычка отводит большинство таймзонных багов.

Timestamp

Unix-timestamp — количество секунд с 1970-01-01 UTC. Python легко конвертирует:

main.py
Output
Click Run to see the output here.

Timestamp-ы полезны для сравнений, сортировки и интеропа с другими системами. Для человеко-понятного вывода сначала конвертируй обратно в datetime.

Замер длительности чего-то

Для быстрых замеров — вычти два datetime:

main.py
Output
Click Run to see the output here.

Для более серьёзного измерения производительности — time.perf_counter(): субмикросекундное разрешение, не зависит от изменений системных часов. datetime.now() ок для чисел в духе «сколько длился этот API-вызов».

Паттерны, которые пригодятся

main.py
Output
Click Run to see the output here.

Что унести с собой

  • 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 про месяцы не знает.

Учитесь программировать с Coddy

НАЧАТЬ