Зачем нужен 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 часов |
Получение текущей даты и времени
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 |
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 = понедельник)