Перейти к содержанию

412 уроков, 25 библиотек и челлендж «Что выведет код?» — бесплатно, код прямо в браузере

Начать обучение
Урок 1 из 20 Начальный 20 мин 100 XP

datetime в Python: первый момент времени

Дата как строка не умеет ничего: ни сравниться, ни посчитаться. Создаём первый объект datetime и разбираем его на поля — от года до секунды.

Редакция Питоники

Дата в жизни программы почти всегда приезжает строкой: «21.10.2026» из лога, «2026-10-21» из формы, «завтра в 12:00» из письма. Пока дата — строка, с ней нельзя сделать ничего осмысленного: две даты честно не сравнить, неделю к ним не прибавить, разницу не посчитать. Модуль datetime из стандартной библиотеки решает это на корню: дата и время становятся объектами, а объекты уже умеют и сравниваться, и считать. Начинаем раздел с главного — создания первого момента.

Первый объект datetime

Сначала маленькая тонкость, которая путает всех новичков: datetime — это и имя модуля, и имя класса внутри него. Строка from datetime import datetime читается тавтологией, но смысл простой: из модуля datetime импортируем класс datetime. Именно класс создаёт моменты: datetime(2026, 10, 21, 12, 0) — двадцать первое октября 2026 года, полдень. Аргументы идут в строгом порядке: год, месяц, день, час, минута, секунда. Часы и минуты можно опустить — получится полночь, и момент всё равно полноценный. Поля момента читаются через точку: year, month, day, hour, minute, second; записать новое значение нельзя — объект неизменяем, новый момент строится новым вызовом.

первый момент времени
from datetime import datetime

moment = datetime(2026, 10, 21, 12, 0)
print(moment)

no_time = datetime(2026, 10, 21)
print(no_time)
Вывод
2026-10-21 12:00:00
2026-10-21 00:00:00
шесть полей момента
from datetime import datetime

moment = datetime(2026, 10, 21, 12, 0)

print(moment.year)
print(moment.month)
print(moment.day)
print(moment.hour)
print(moment.minute)
print(moment.second)
Вывод
2026
10
21
12
0
0

Как datetime печатает себя

print и repr
from datetime import datetime

moment = datetime(2026, 10, 21, 12, 0)

print(moment)
print(repr(moment))
print([moment])
Вывод
2026-10-21 12:00:00
datetime.datetime(2026, 10, 21, 12, 0)
[datetime.datetime(2026, 10, 21, 12, 0)]

У даты два лица: print показывает момент ISO-строкой, а repr — вызовом конструктора, по которому объект восстанавливается один в один. По repr из traceback-а сразу видно, какой именно момент лежал в переменной, а ISO-строка сортируется правильно — к сортировке мы вернёмся в уроке 7. Строкам же доверять не стоит: выражение '9.10.2026' > '10.10.2026' вернёт True, потому что строки сравниваются посимвольно, и девятка выигрывает у единицы. Честное сравнение дат устроим позже — для него и нужны объекты.

Что лежит внутри объекта datetime

Под капотом datetime хранит не строку, а набор целых чисел: год, месяц, день, час, минута, секунда и микросекунды. Плюс два служебных поля — часовой пояс (у наших объектов он пустой, такие моменты называют наивными) и признак fold, который различает повторяющийся час при переходе на летнее время. Отсюда два следствия, полезные дальше. Первое: сравнение моментов не превращает их в текст, поэтому оно быстрое и не зависит от локали машины. Второе: два момента с одинаковыми полями равны, хотя в памяти это разные объекты, а значит, datetime годится на роль ключа словаря.

moment.py — поля, зона и равенство
from datetime import datetime

moment = datetime(2026, 10, 21, 14, 30, 0, 123456)

print(moment.microsecond)
print(moment.tzinfo)
print(moment == datetime(2026, 10, 21, 14, 30, 0, 123456))
print(moment < datetime(2026, 10, 22))
Вывод
123456
None
True
True

Микросекунды в обычной жизни почти не видны: у момента, собранного руками, их ноль, и печать выглядит как 2026-10-21 14:30:00. Ненулевые микросекунды появляются у now() — часы компьютера умеют фиксировать момент точнее секунды. Само поле существует всегда, просто чаще всего равно нулю. Отдельно про tzinfo: он равен None, потому что мы не сказали объекту, в каком часовом поясе живёт этот момент. Наивные моменты хороши тем, что не требуют вози с зонами, — но смешивать их с осознанными нельзя, об этом урок про часовые пояса.

Месяц и день местами: ошибка, которую видно не сразу

Конструктор принимает месяц первым, а в русской записи день идёт первым: 21.10.2026 читается как двадцать первое октября, а datetime ждёт (год, месяц, день). Перепутать их легко, и вот что неприятно. Если в день попало число больше двенадцати, Python честно падает с ValueError — мимо такого не пройти. А если числа маленькие, например 5 и 10, объект создаётся, и дата получается ровно противоположная той, о которой думал человек. Никакой ошибки, никакого предупреждения: в отчёте за март внезапно оказывается пять октября, и считать выручку приходится вручную.

swap.py — два похожих вызова, две разные даты
from datetime import datetime

print(datetime(2026, 5, 10))
print(datetime(2026, 10, 5))
Вывод
2026-05-10 00:00:00
2026-10-05 00:00:00

Объект неизменяем — и это скорее подарок

Попытка изменить поле у готового момента заканчивается ошибкой: у datetime нет сеттеров. Поначалу это раздражает — хочется взять объект из словаря и поправить в нём час. Но вдумайтесь, что было бы, если бы это было возможно: объект лежит сразу в пяти местах, и любая правка молча поменяла бы все пять. С датами такого не хочется. Срок платежа, привязанный к записи, должен остаться тем же самым в логе, в отчёте и в письме. Поэтому datetime устроен как строки и кортежи: любой изменяющий метод возвращает новый объект. Приём называется replace, ему посвящён урок 11.

immutable.py — поле не переписать
from datetime import datetime

moment = datetime(2026, 10, 21, 14, 30)

try:
    moment.year = 2027
except AttributeError:
    print('поле менять нельзя')

print(moment.year)
Вывод
поле менять нельзя
2026
ПолеЧто значитДля 21.10.2026 14:30
yearгод числом2026
monthномер месяца, 1–1210
dayдень месяца21
hourчас в сутках, 0–2314
minuteминута30
secondсекунда0
microsecondмикросекунды, 0–9999990

Сегодня ты создал первый момент — datetime(2026, 10, 21, 12, 0), разобрал его на атрибуты и научился читать оба его представления. Дальше по курсу: урок 2 — три класса модуля: date без часов, time без даты и момент целиком; урок 3 — now и today: как получить настоящий текущий момент, а не фиксированный.

Момент времени — это объект с полями от года до секунды: его можно создать, разобрать на части и напечатать, но нельзя испортить невозможной датой.

Что выведет код?

Сначала предскажи ответ в голове — это главный навык программиста.

from datetime import datetime

moment = datetime(2026, 10, 21, 12, 0)
print(moment.hour, moment.minute)
from datetime import datetime

print(datetime(2027, 1, 15))
from datetime import datetime

moment = datetime(2026, 10, 21, 12, 0)
print(repr(moment))
Проверь себя
0 / 9

1. Что выведет print(datetime(2026, 10, 21))?

2. В каком порядке datetime(...) принимает аргументы?

3. Что вернёт moment.minute для datetime(2026, 10, 21, 12, 0)?

4. Чем print(moment) отличается от print(repr(moment))?

5. Что произойдёт при вызове datetime(2026, 13, 1)?

6. Почему строку «9.10.2026» опасно сравнивать со строкой «10.10.2026»?

7. Чем datetime(2026, 10, 21) отличается от datetime(2026, 10, 21, 0, 0)?

8. Что произойдёт, если попытаться изменить поле готового момента?

9. Какой из двух вызовов даст дату, которую вы обычно имеете в виду, записывая 5.10.2026?

Карточки терминов
Запомнено: 0 / 9
Практика

Создай момент защиты диплома — 12 июня 2027 года, 10:30 утра. Выведи сам момент, затем отдельно его год и отдельно минуты.

practice.py
Вопросы и ответы по уроку

Что такое datetime в Python простыми словами?

Это класс стандартного модуля datetime, который хранит момент времени шестью полями: год, месяц, день, час, минута, секунда. Один вызов datetime(2026, 10, 21, 12, 0) создаёт момент, атрибуты дают его поля по отдельности, а печать показывает дату ISO-строкой.

Урок 2: date, time и datetime

Почему пишут from datetime import datetime?

Потому что datetime — это и модуль, и класс с тем же именем внутри него. Слева — модуль, справа — класс. Можно импортировать модуль целиком (import datetime) и писать datetime.datetime(...), но короче один раз импортировать сам класс.

Что означает 00:00:00 в выводе datetime?

Полночь. Если час, минута и секунда не указаны при создании, они равны нулю — момент всё равно полноценный datetime, просто без явного времени. Чтобы убрать время из вывода, дату форматируют строкой, например strftime('%d.%m.%Y'), — этому посвящён урок 4.

Урок 4: strftime

Можно ли поменять год у существующего datetime?

Нет: объекты datetime неизменяемы, попытка присвоить moment.year = 2027 упадёт с ошибкой. Новый момент строится новым вызовом datetime(...) или методом replace, который разбирается в уроке 11.

Почему datetime(2026, 10, 21) и datetime(2026, 10, 21, 0, 0) — одно и то же?

Часы, минуты и секунды, которые не указали, просто равны нулю. Так что первый вызов даёт ровно полночь 21 октября 2026 года — объект с микросекундами 0. Это удобно: короткая запись не меняет смысла момента, а полночь получается сама собой, без отдельной ветки в коде.

Что значит «наивный» datetime?

Момент, у которого поле tzinfo пустое (None) — то есть никто не сказал, в каком часовом поясе он живёт. Наивные моменты удобны для внутренних расчётов и сравнений, но при передаче между машинами в разных поясах они становятся источником ошибок. Об осознанных моментах с зоной — в уроке про часовые пояса.

Урок 14: часовые пояса

Почему месяц в конструкторе идёт раньше дня, если в русской записи наоборот?

Так решили в стандартной библиотеке: порядок «год, месяц, день» совпадает с ISO-форматом и с сортировкой, где старший разряд слева. Отсюда и ловушка: datetime(2026, 5, 10) — это 5 мая, а не 5 октября. Если числа больше двенадцати, Python падает с ValueError, а вот 5 и 10 проходят молча — проверяйте такие даты в тестах.

Понравился урок? Сошлитесь на него

«print показывает момент ISO-строкой, а repr — вызовом конструктора, по которому объект восстанавливается один в один.»

Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.

Похожие уроки по темам

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