Модуль 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 или формируйте имена вручную.


Смотрите также


Примечание

Лицензия и источники

Часть материала адаптирована из официальной документации Python (https://docs.python.org/3/library/datetime.html), доступной под Python Software Foundation License Version 2 (PSF License). Адаптация, переработка, оригинальные примеры и пояснения — © AlashEd Wiki.