datetime в Python: как работать с датой, временем и timedelta

print(“Минут пять десять пятого утра”)

datetime в Python: как работать с датой, временем и timedelta

Модуль datetime в Python создан для упрощения работы с датами. С его помощью можно посчитать, сколько суток осталось до дедлайна, каким днём недели было 25 августа 1991 года, или измерить промежуток времени между двумя событиями. Модуль доступен в стандартной библиотеке Python, поэтому подключается к проекту одной строкой импорта.

ВАМ ПРИШЛО ПРИГЛАШЕНИЕ 💌
Приходите к нам в соцсети поделиться своим мнением и почитать, что пишут другие. А ещё там выходит дополнительный контент, которого нет на сайте — шпаргалки, опросы и разная дурка. В общем, вот тележка, вот ВК — велком!

Что входит в модуль datetime Python

Есть пять основных классов:

  • date хранит календарную дату из трёх чисел: год, месяц и день.
  • time содержит только время суток с точностью до микросекунд.
  • datetime соединяет предыдущие два в одно целое, например 25 августа 1991 года, 14:30.
  • timedelta хранит длительность: семь дней, четыре часа, тридцать секунд.
  • timezone описывает часовой пояс через смещение относительно всемирного времени UTC.

Классы работают совместно друг с другом. Например, разница двух объектов datetime даёт timedelta. Также из datetime можно получить отдельно дату или отдельно время.

Как получить текущую дату и время в Python

Метод datetime.now() возвращает дату и время по часовому поясу компьютера, на котором выполняется код. Результат включает год, месяц, число, часы, минуты, секунды и микросекунды.

# Импорт модуля datetime в python
from datetime import datetime, date, timezone

# Локальное время компьютера, на котором выполняется код
local_time = datetime.now()
print(local_time)  # например, 2026-08-10 15:56:53.299246

Если нужна только дата без времени, применяют date.today(). Метод возвращает объект с годом, месяцем и числом. Пригождается в задачах вроде подсчёта возраста или проверки наступившего дня.

# Импорт модуля datetime
from datetime import datetime, date, timezone

# Только дата, без времени
today = date.today()
print(today)  # например, 2026-08-10

Если приложение работает в нескольких часовых поясах или обслуживает пользователей из разных стран, используйте datetime.now(timezone.utc). Метод возвращает время по эталону UTC, от которого отсчитываются часовые пояса во всём мире.

# Импорт модуля datetime
from datetime import datetime, date, timezone

# Время по UTC с явным указанием часового пояса
utc_time = datetime.now(timezone.utc)
print(utc_time)  # например, 2026-08-10 11:56:53.299246+00:00

Время в UTC избавляет от путаницы, когда сервер и пользователи находятся в разных регионах. Раньше для этой цели использовали метод datetime.utcnow(). С выходом Python 3.12 разработчики языка отметили его как устаревший. Не используйте datetime.utcnow() в последних версиях.

Большая скидка — 16% на все курсы Практикума

Если вы читаете эту статью, тогда вы точно разбираетесь в технологиях. Стать лучше и зарабатывать больше можно после курсов Практикума — по программированию, анализу данных и искусственному интеллекту.

До 17 сентября на все курсы действует скидка 16%, она применится автоматически при оплате. Потом цены станут выше, поэтому не откладывайте!

В Практикуме есть программы для начинающих и специалистов с опытом, которые хотят обновить знания или освоить новое направление.

Как вручную задать дату и время в Питоне

В datetime можно задать любую другую дату и время. За это отвечает функция, которая создаёт объект по переданным параметрам.

from datetime import datetime, date, time

# Полная дата и время
dt = datetime(2026, 8, 10, 14, 30, 0)
print(dt)
# 2026-08-10 14:30:00

Конструктор datetime принимает семь аргументов: год, месяц, день, час, минуту, секунду и микросекунду. Обязательно указывайте год, месяц и день, без них Python выдаст ошибку. Оставшиеся четыре можно не прописывать, они автоматически заполняются нулями.

# Если указать только дату, время станет нулевым
dt_only_date = datetime(2026, 8, 10)
print(dt_only_date)
# 2026-08-10 00:00:00

Если время не нужно вовсе, а важна только дата, используется класс date. Он работает по тому же принципу с тремя аргументами.

d = date(2026, 8, 10)
print(d)
# 2026-08-10

Когда в Python нужно задать произвольное время суток, используйте класс time. Он принимает часы, минуты, секунды и микросекунды:

t = time(14, 30, 0)
print(t)
# 14:30:00

Как форматировать дату и время

Дата в объекте datetime хранится в виде чисел. Чтобы вывести дату в удобном виде, применяется strftime(). Название расшифровывается как «string format time», то есть форматирование времени в строку.

Объект datetime в Питоне превращается в текстовую строку по шаблону с директивами (коды со знаком процента):

from datetime import datetime

now = datetime.now()
print(now.strftime("%d.%m.%Y %H:%M"))
# 10.08.2026 14:30

Обратная задача решается методом strptime() — parse time. Он берёт текстовую строку и превращает её в объект datetime, с которым уже можно производить вычисления.

date_string = "10.08.2026"
parsed_date = datetime.strptime(date_string, "%d.%m.%Y")

Шаблон должен точно совпадать со структурой строки, иначе Python выбросит ошибку ValueError.

ДирективаЗначениеПример
%YГод (4 цифры)2026
%mМесяц (2 цифры)08
%dДень месяца10
%HЧас (24-часовой формат)14
%MМинуты30
%SСекунды00
%fМикросекунды299246
%zЧасовой пояс+0300

Полный список директив можно посмотреть в официальной документации Python.

В Python 3.14 разработчики упростили работу с датой и временем по отдельности. Раньше для парсинга строки в объект date или time приходилось сначала вызывать datetime.strptime(), потом извлекать нужную часть методом .date() или .time(). В Python 3.14 классы date и time получили собственные методы strftime().

from datetime import date, time
d = date.strptime("10.08.2026", "%d.%m.%Y")
t = time.strptime("14:30:00", "%H:%M:%S")

Как складывать и вычитать даты в Python через timedelta

Даты в Python нельзя просто взять и сложить, как числа.

Есть отдельный класс timedelta — он хранит разницу между двумя моментами времени и умеет складываться с объектами date и datetime.

Например, если нужно узнать, какое число будет через 10 дней, нужно создать объект timedelta с параметром days=10 и прибавить его к текущей дате. Вычитание работает аналогично — можно отнять timedelta от даты и получить дату в прошлом, а можно вычесть одну дату из другой и получить сам timedelta.

from datetime import date, timedelta

today = date.today()
delta = timedelta(days=10)
future_date = today + delta

print(today)        # 2026-08-10
print(future_date)  # 2026-08-20

Конструктор timedelta принимает семь аргументов: days, seconds, microseconds, milliseconds, minutes, hours, weeks. Их можно комбинировать в любом порядке и указывать не все сразу. Например, timedelta(weeks=2, days=3, hours=5) создаст промежуток в две недели, три дня и пять часов.

timedelta хранит только три значения: days, seconds и microseconds. Остальные четыре аргумента milliseconds, minutes, hours и weeks Python автоматически переводит в эту тройку при создании объекта.

Например, если создать timedelta(hours=25), то при обращении к атрибуту .days объект покажет 1, а к .seconds — 3600. Часы разложились на сутки и остаток в секундах. То же самое произойдёт с неделями: они конвертируются в дни, а минуты и миллисекунды — в секунды и микросекунды соответственно.

Когда внутри объекта всего три поля, Python может быстро складывать, вычитать и сравнивать разные интервалы времени, не разбираясь заранее, в каких единицах их создавали. Пользователю же для расчётов вообще не обязательно помнить про это внутреннее устройство.

На практике timedelta в Python чаще всего появляется как результат вычитания одной даты из другой:

start = datetime(2026, 1, 1, 9, 0, 0)
now = datetime(2026, 3, 15, 14, 30, 0)

diff = now - start
print(diff.days)            # 74
print(diff.total_seconds()) # 6415800.0

Атрибут .days отдаёт количество полных суток между датами, отбрасывая остаток в часах и минутах. Метод .total_seconds() переводит интервал в секунды одним числом, включая дни, часы и микросекунды. Это удобно, когда нужно сравнить два промежутка времени или вывести разницу в понятном формате — например, посчитать, сколько часов прошло с момента последнего входа пользователя в систему.

Как работать с часовыми поясами через aware и naive datetime

Объекты datetime в Python делятся на два типа: naive и aware.

Naive-объект хранит дату и время, но ничего не знает о часовом поясе. Python воспринимает такую метку времени как абстрактное число, без привязки к Москве, Лондону или UTC. Если создать два naive datetime с одинаковыми числами, Python посчитает их равными, даже если один означал время в Москве, а другой — в Нью-Йорке. В aware-объекте есть информация о часовом поясе, поэтому программа понимает, к какой точке на карте относится это время. 

Сравнивать naive и aware datetime напрямую нельзя — Python выбросит исключение TypeError. Интерпретатор не может понять, что сравнивать со временем без часового пояса. Прежде чем сопоставлять два datetime, оба нужно привести к одному виду — либо сделать naive, либо добавить обоим временную зону.

Для работы с часовыми поясами в Python используют модуль zoneinfo. Он встроен в стандартную библиотеку начиная с версии 3.9. Раньше для этой задачи применяли библиотеку pytz, но у неё специфический синтаксис и особенности с localize(). Если проект не должен поддерживать древние версии Python, сразу переходите на zoneinfo — код получится короче и понятнее.

from datetime import datetime
from zoneinfo import ZoneInfo

moscow_time = datetime.now(ZoneInfo("Europe/Moscow"))
print(moscow_time)

Подход через zoneinfo избавляет от путаницы с часовыми поясами и делает код предсказуемым на любом сервере.

Какие ошибки допускают новички при работе с datetime в Python

  • Сравнение naive и aware datetime без приведения к одному виду. Разработчик получает время из одного источника как naive, а из другого — как aware, и пытается их сравнить. Нужно приводить оба объекта к одному формату: явно указывать часовой пояс, либо убирать его через replace(tzinfo=None).
  • Использование устаревшего utcnow(). Метод возвращает naive-объект, хотя логически должен работать с UTC. Разработчики Python официально не рекомендуют его с версии 3.12, поскольку он вводит в заблуждение. Вместо него стоит использовать datetime.now(timezone.utc), который возвращает корректный aware-объект.
  • Ручной парсинг строк вместо strptime(). Некоторые новички пишут регулярные выражения, чтобы вытащить день, месяц и год из строки вроде “25.08.1991”. Получается громоздкий и хрупкий код, который ломается при малейшем изменении формата. Метод strptime() решает эту задачу одной строкой и умеет работать с десятками форматов дат из коробки.
from datetime import datetime

date_str = "25.08.1991"
parsed_date = datetime.strptime(date_str, "%d.%m.%Y")
  • Путаница между timedelta.days и timedelta.total_seconds(). Атрибут days у объекта timedelta возвращает только целое количество полных суток, отбрасывая часы и минуты. Если разница между двумя датами составляет полтора дня, days вернёт 1, а не 1.5. Для точного расчёта длительности используйте total_seconds() и делите результат на нужную единицу измерения.

Всегда работайте с aware-объектами, если приложение хоть немного связано с разными часовыми поясами. Для UTC используйте datetime.now(timezone.utc). И для расчёта точной длительности берите total_seconds(), если в интервале есть часы или минуты.

Советуем дополнительно почитать

Как установить Python на компьютер и начать на нём писать — пошаговая установка на Windows и macOS с проверкой версии; пригодится, чтобы убедиться, что у вас не 3.8, где половина примеров не заработает.

Работа с JSON и XML в Python  — как достать дату из ответа API, где она приходит строкой, и что с ней делать дальше.

Собеседование на Python-разработчика: что спрашивают у джунов и мидлов — что спрашивают про стандартную библиотеку и почему разница между naive и aware иногда всплывает на техническом интервью.

Python-разработчик: сколько платят, что нужно уметь и куда идти работать  — направления найма, требования и вилки для тех, кто учит язык не из любопытства.

Странные программисты говорят про время — подборка заблуждений о датах, в которые верит почти каждый, пока не наступит 29 февраля.

Бонус для читателей

Если вам интересно погрузиться в мир ИТ и при этом немного сэкономить, держите наш промокод на курсы Практикума. Вы получите скидку при оплате, она поможет со льготной ипотекой и даст безлимит на маркетплейсах. Ладно, окей, это просто скидка, без остального, но хорошая.

Вам может быть интересно
easy
[anycomment]
Exit mobile version