Урок 39 datetime

Работа с датами и временем: сейчас, завтра, через неделю, в любом формате

⏱ ~10 мин чтения· 📘 Базовый

Зачем нужен datetime?

Модуль datetime — основной инструмент Python для работы с датами и временем. Он входит в стандартную библиотеку и позволяет:

  • Получать текущую дату и время
  • Форматировать даты в любом виде
  • Разбирать даты из строк
  • Вычислять разницу между датами
  • Работать с часовыми поясами (через zoneinfo в Python 3.9+)

Основные классы модуля datetime

КлассЧто хранитПример
dateГод, месяц, день2026-06-23
timeЧасы, минуты, секунды14:30:00
datetimeДата + время2026-06-23 14:30:00
timedeltaРазница между датами3 дня, 5 часов
```python from datetime import date, time, datetime, timedelta ```

Получение текущей даты и времени

from datetime import date, datetime

# Только сегодняшняя дата
today = date.today()
print(today)  # 2026-06-23

# Текущие дата и время
now = datetime.now()
print(now)    # 2026-06-23 14:30:15.123456

# Отдельные компоненты
print(now.year)    # 2026
print(now.month)   # 6
print(now.day)     # 23
print(now.hour)    # 14
print(now.minute)  # 30
print(now.second)  # 15
print(now.weekday())  # 1 (понедельник = 0, вторник = 1, ..., воскресенье = 6)

Создание конкретной даты

from datetime import date, datetime, time

# Конкретная дата
d = date(2026, 12, 31)
print(d)  # 2026-12-31

# Дата и время
dt = datetime(2026, 6, 15, 18, 30, 0)
print(dt)  # 2026-06-15 18:30:00

# Только время
t = time(14, 30, 0)
print(t)   # 14:30:00

strftime() — форматирование даты в строку

strftime (string format time) преобразует дату в строку по шаблону.

КодЗначениеПример
%YГод (4 цифры)2026
%mМесяц (01-12)06
%dДень (01-31)23
%HЧасы (00-23)14
%MМинуты (00-59)30
%SСекунды (00-59)15
%AДень недели (полный)Tuesday
%aДень недели (сокр.)Tue
%BМесяц (полный)June
%bМесяц (сокр.)Jun
```python from datetime import datetime

now = datetime.now()

print(now.strftime("%d.%m.%Y")) # 23.06.2026 print(now.strftime("%H:%M:%S")) # 14:30:15 print(now.strftime("%d %B %Y года, %A")) # 23 June 2026 года, Tuesday print(now.strftime("%Y-%m-%d %H:%M")) # 2026-06-23 14:30 (ISO-формат)


## strptime() — разбор строки в дату

`strptime` (string parse time) — обратная операция: превращает строку в объект даты.

```python
from datetime import datetime

# Разбор строки в дату
date_str = "23.06.2026"
d = datetime.strptime(date_str, "%d.%m.%Y")
print(d)  # 2026-06-23 00:00:00

# Разбор строки с временем
dt_str = "2026-06-23 14:30:00"
dt = datetime.strptime(dt_str, "%Y-%m-%d %H:%M:%S")
print(dt)  # 2026-06-23 14:30:00

# Разбор нестандартного формата
dt2 = datetime.strptime("23 June 2026, 2:30 PM", "%d %B %Y, %I:%M %p")
print(dt2)  # 2026-06-23 14:30:00

timedelta — разница между датами

timedelta представляет промежуток времени. Можно прибавлять и вычитать из дат.

from datetime import datetime, timedelta

now = datetime.now()

# Создание промежутка
one_day = timedelta(days=1)
one_week = timedelta(weeks=1)
three_hours = timedelta(hours=3)
complex_delta = timedelta(days=2, hours=5, minutes=30)

# Арифметика с датами
tomorrow = now + one_day
yesterday = now - one_day
next_week = now + one_week

print(f"Сегодня: {now.date()}")
print(f"Завтра:  {tomorrow.date()}")
print(f"Вчера:   {yesterday.date()}")

# Разница между датами
deadline = datetime(2026, 12, 31)
delta = deadline - now
print(f"До Нового года осталось {delta.days} дней")
print(f"Или {delta.total_seconds() / 3600:.1f} часов")

Практический пример: калькулятор возраста

from datetime import datetime, date

def calculate_age(birth_date_str):
    """Считает возраст по дате рождения (формат ДД.ММ.ГГГГ)."""
    birth = datetime.strptime(birth_date_str, "%d.%m.%Y")
    today = date.today()

    age = today.year - birth.year
    # Проверяем, был ли день рождения в этом году
    if today.month < birth.month or (today.month == birth.month and today.day < birth.day):
        age -= 1

    return age

print(f"Возраст: {calculate_age('15.05.1995')} лет")
# Пример: Возраст: 31 лет

Итоги

  • datetime.now() — текущие дата и время
  • date.today() — только сегодняшняя дата
  • strftime(шаблон) — дата → строка по формату
  • strptime(строка, шаблон) — строка → дата
  • timedelta — разница между датами, арифметика с датами
  • Коды форматирования: %Y %m %d %H %M %S — основа
  • .weekday() — день недели (0 = понедельник)