Модуль datetime — даты и время в Python
Модуль datetime — основной инструмент Python для работы с датами и временем.
Он умеет складывать даты, считать разницу между ними, форматировать в строку,
парсить из строки, работать с часовыми поясами.
Базовые классы:
date— только дата (год, месяц, день).time— только время (часы, минуты, секунды, микросекунды).datetime— дата + время.timedelta— длительность, разница между двумя моментами.timezone— часовой пояс.
Все они импортируются из модуля datetime:
from datetime import date, time, datetime, timedelta, timezone
Текущая дата и время
from datetime import date, datetime
today = date.today()
now = datetime.now()
print(today) # 2026-05-14
print(now) # 2026-05-14 10:23:45.123456
Метод datetime.now() возвращает локальное время без часового пояса
(naive). Для времени с часовым поясом используют:
from datetime import datetime, timezone
utcnow = datetime.now(timezone.utc)
print(utcnow) # 2026-05-14 05:23:45.123456+00:00
Создание даты вручную
from datetime import date, datetime
d = date(2026, 5, 14)
dt = datetime(2026, 5, 14, 10, 30, 0)
print(d.year, d.month, d.day) # 2026 5 14
print(dt.weekday()) # 0..6 (понедельник = 0)
print(dt.isoweekday()) # 1..7 (понедельник = 1)
Атрибуты и компоненты
datetime(2026, 5, 14, 10, 30, 45, 123456, tzinfo=...)
^^^^ ^ ^^ ^^ ^^ ^^ ^^^^^^^
year m d H M S microsecond
Полезные методы:
.weekday()— день недели как число (0 — понедельник)..isoweekday()— то же, но 1 — понедельник..isoformat()— строка в формате ISO 8601:'2026-05-14T10:30:45'..timestamp()— Unix-время (секунды от 1970-01-01 UTC)..date()/.time()— выделить только дату или только время изdatetime.
Арифметика дат: timedelta
timedelta — это длительность. Их можно складывать с датами и вычитать друг
из друга.
from datetime import datetime, timedelta
now = datetime.now()
tomorrow = now + timedelta(days=1)
in_two_hours = now + timedelta(hours=2)
week_ago = now - timedelta(weeks=1)
diff = tomorrow - now
print(diff) # 1 day, 0:00:00
print(diff.days) # 1
print(diff.total_seconds()) # 86400.0
Параметры timedelta: days, seconds, microseconds,
milliseconds, minutes, hours, weeks. Месяцев и лет нет — у них
переменная длина. Для них используют сторонний python-dateutil:
# pip install python-dateutil
from dateutil.relativedelta import relativedelta
from datetime import date
next_month = date.today() + relativedelta(months=1)
Форматирование: strftime
Превращение даты в строку — методом strftime («string format time»):
from datetime import datetime
now = datetime.now()
print(now.strftime('%Y-%m-%d')) # 2026-05-14
print(now.strftime('%d.%m.%Y %H:%M')) # 14.05.2026 10:30
print(now.strftime('%A, %d %B %Y')) # Thursday, 14 May 2026
Главные коды:
%Y год 4 цифры 2026
%y год 2 цифры 26
%m месяц 01-12 05
%d день 01-31 14
%H часы 00-23 10
%M минуты 00-59 30
%S секунды 00-59 45
%A полное имя дня Thursday
%a короткое имя дня Thu
%B полное имя месяца May
%b короткое имя месяца May
%j день года 001-366 134
%w день недели 0-6 4
Парсинг: strptime
Обратное действие — превратить строку в дату:
from datetime import datetime
s = '14.05.2026 10:30'
dt = datetime.strptime(s, '%d.%m.%Y %H:%M')
print(dt) # 2026-05-14 10:30:00
Формат должен точно соответствовать строке, иначе ValueError.
ISO 8601 — самый удобный формат для обмена датами. Для него есть отдельный метод:
dt = datetime.fromisoformat('2026-05-14T10:30:00')
Часовые пояса
В Python принято делить datetime на:
naive — без часового пояса (
tzinfo=None);aware — с часовым поясом.
Смешивать их в одном выражении нельзя (получите TypeError).
Современный способ работать с поясами — модуль zoneinfo (с Python 3.9):
from datetime import datetime
from zoneinfo import ZoneInfo
astana = datetime.now(ZoneInfo('Asia/Almaty'))
utc = astana.astimezone(ZoneInfo('UTC'))
ny = astana.astimezone(ZoneInfo('America/New_York'))
print(astana, utc, ny, sep='\n')
Практический пример: сколько дней до Нового года
from datetime import date
today = date.today()
new_year = date(today.year + 1, 1, 1)
days_left = (new_year - today).days
print(f'До нового года: {days_left} дней')
Практический пример: возраст пользователя
from datetime import date
def age(birthday: date) -> int:
today = date.today()
years = today.year - birthday.year
if (today.month, today.day) < (birthday.month, birthday.day):
years -= 1
return years
print(age(date(2005, 3, 12)))
Тонкость: нужно вычесть год, если день рождения в этом году ещё не наступил.
Практический пример: вчерашние логи
from datetime import datetime, timedelta
yesterday = datetime.now() - timedelta(days=1)
filename = yesterday.strftime('logs/app-%Y-%m-%d.log')
print(filename)
# logs/app-2026-05-13.log
Подводные камни
Предупреждение
Naive и aware смешивать нельзя. Решите заранее, в каком режиме работаете. Для серверных приложений — всегда UTC внутри, локальное время только на выводе.
``datetime.utcnow()`` устаревший (Python 3.12+). Используйте
datetime.now(timezone.utc).``strptime`` строгий. Лишний пробел или другой разделитель — ошибка.
Месяцы и годы — не ``timedelta``. Используйте
dateutil.relativedeltaили ручную арифметику.Локаль для имён дней/месяцев.
%Aи%Bзависят от системной локали. Для предсказуемого вывода настраивайте её черезlocale.setlocaleили формируйте имена вручную.
Смотрите также
Модуль time — низкоуровневая работа со временем — модуль
timeдля Unix-времениPython: строки — форматирование строк
Примечание
Лицензия и источники
Часть материала адаптирована из официальной документации Python (https://docs.python.org/3/library/datetime.html), доступной под Python Software Foundation License Version 2 (PSF License). Адаптация, переработка, оригинальные примеры и пояснения — © AlashEd Wiki.