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 печатает себя
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 годится на роль ключа словаря.
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, объект создаётся, и дата получается ровно противоположная той, о которой думал человек. Никакой ошибки, никакого предупреждения: в отчёте за март внезапно оказывается пять октября, и считать выручку приходится вручную.
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.
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–12 | 10 |
| day | день месяца | 21 |
| hour | час в сутках, 0–23 | 14 |
| minute | минута | 30 |
| second | секунда | 0 |
| microsecond | микросекунды, 0–999999 | 0 |
Сегодня ты создал первый момент — 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))
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?
Создай момент защиты диплома — 12 июня 2027 года, 10:30 утра. Выведи сам момент, затем отдельно его год и отдельно минуты.
Что такое 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-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Datetime · Урок 2
date, time и datetime: три класса
День рождения без часов, будильник без календаря, лог-запись со всем сразу. Три класса модуля datetime — и правило, какой выбрать под задачу.
Datetime · Урок 3
now и today: текущий момент
Фиксированные даты хороши для примеров, а для логов и дедлайнов нужен настоящий сейчас. Учимся получать текущий момент — и понимать, почему вывод перестаёт быть предсказуемым.
Datetime · Урок 4
strftime: дата превращается в строку
Объект даты хорош для вычислений, а человеку нужна строка «21.10.2026». Один метод strftime и горстка кодов — и дата принимает любой вид.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
re · Урок 1
Регулярные выражения Python с нуля: первый шаблон и модуль re
Первый шаблон, который находит любую дату в тексте, а не одну конкретную: import re, re.search, raw-строки и объект Match — всё, чтобы перестать бояться регулярки.
модуль reimport re
openpyxl · Урок 9
Даты в Excel через openpyxl: запись, формат и арифметика
Пишем в ячейку настоящий datetime, показываем его по-русски маской DD.MM.YYYY и считаем дни между датами — а заодно узнаём, почему дату из файла нельзя сравнивать со строкой.
openpyxl дата в ячейкеexcel python дата
Datetime · Урок 19
Даты в логах: разбор реального формата
Журнал из строк вида «2026-10-21 09:15:03 ERROR …»: разбираем момент через strptime, сортируем события по времени и вырезаем записи за интервал.
python разобрать дату из логаpython сортировка лога по времени