now и today: текущий момент
Фиксированные даты хороши для примеров, а для логов и дедлайнов нужен настоящий сейчас. Учимся получать текущий момент — и понимать, почему вывод перестаёт быть предсказуемым.
Редакция Питоники
Все даты в первых двух уроках созданы руками: datetime(2026, 10, 21, 12, 0) и близнецы. Настоящей «сейчас»-даты среди них нет, и это не случайность, а дисциплина: сейчас-дата — единственное значение в модуле, которое нельзя предсказать заранее. Разберёмся, как её получать и что из этого следует.
datetime.now(): момент по часам компьютера
Метод now() принадлежит самому классу datetime: вызывается не у объекта, а у класса, и возвращает новый объект с текущими значениями полей. Поля знакомые — year, month, day, hour, minute — просто теперь они честные, на момент вызова.
from datetime import datetime
moment = datetime.now()
print(moment)
print(moment.year, moment.month, moment.day)
print(moment.hour, moment.minute)
2026-10-23 14:37:12.084521 2026 10 23 14 37
В выводе появилось то, чего не было раньше: микросекунды. now() знает момент точнее секунды — 12.084521 означает «12 секунд и 84 521-я микросекунда». Для меток в логах это ровно то, что нужно. Кстати, у datetime есть и метод today() — без аргументов это синоним now(); историческое имя осталось с тех времён, когда о часовых поясах в модуле ещё не думали. Настоящие различия между ними начнутся в уроке 14.
date.today(): только сегодня
Если нужен только календарный день, время в выводе — шум. У класса date есть собственный метод today(): сегодняшняя дата без часов. Поля у результата знакомые — year, month, day; времени суток здесь нет и быть не может: сегодня — это дата, а для «сегодня в 14:37» нужен datetime.now() или его метод .time() из урока 2.
from datetime import date
today = date.today()
print(today)
print(today.year, today.month, today.day)
2026-10-23 2026 10 23
Четыре лица текущего момента
| Способ | Тип результата | Что внутри |
|---|---|---|
| date.today() | date | год, месяц, день |
| datetime.now() | datetime | плюс часы, минуты, секунды, микросекунды |
| datetime.now().date() | date | то же, что date.today(), но другим путём |
| datetime.now().time() | time | часы, минуты, секунды без даты |
Один и тот же «сейчас» можно разобрать на четыре части, и выбор зависит от того, что вы с ним собираетесь делать. День без часов удобен там, где вы сравниваете даты с границами периода: лишнего времени в объекте date просто нет, и ошибиться не с чем. Полный момент нужен, когда важна последовательность событий, а время без даты — когда дата лежит в соседнем поле. Отдельно стоит заметить, что date.today() и datetime.now().date() дают одинаковый результат: второй просто длиннее. В рабочем коде мы берём короткий.
Почему в примерах курса фиксированные даты
Каждый код-блок на этой странице можно запустить и сверить вывод, а с now() фокус не выйдет. Вывод меняется от запуска к запуску, поэтому в проверяемых примерах курса даты фиксированные, а «сейчас» подставляется переменной. По-настоящему now() и today() незаменимы там, где предсказуемость и не нужна: метки в логах, «дней до дедлайна» в интерфейсе, отчёты «за сегодня». Смотрим на подсчёт дней до релиза: код выглядит ровно как в настоящем приложении, только вместо настоящего now — подставная дата.
from datetime import datetime
now = datetime(2026, 10, 23, 14, 37) # подставное «сейчас»
release = datetime(2026, 11, 1, 12, 0)
left = release - now
print(left)
print(left.days)
8 days, 21:23:00 8
now() лучше передавать функции, а не звать внутри
С подставной датой есть одна неочевидная выгода, которую стоит назвать прямо. Если функция принимает текущий момент аргументом, её можно вызвать с любой датой — и проверить, что она считает правильно. Если же она сама зовёт datetime.now() внутри, проверить её нечем: результат зависит от того, в какой миллисекунде запустили тест. Проверка на две разные даты вместо одной — уже два теста. Мы в рабочих проектах держим правило: функции, которые считают дни и сроки, принимают now параметром, а вызов datetime.now() живёт в одном месте — там, где функцию зовут.
from datetime import datetime
def days_until(target, now):
return (target - now).days
release = datetime(2026, 11, 1, 12, 0)
now = datetime(2026, 10, 21, 14, 30)
print(days_until(release, now))
10
Читается такой код чуть длиннее, чем одна строка с now() внутри, зато проверяется честно. Побочный эффект приятный: функцию days_until можно вызвать с граничными значениями — за день до срока, за минуту до, ровно в срок — и получить осмысленные числа вместо «сегодня примерно десять дней назад».
Граница суток: почему «вчера» иногда не вчера
Ещё одна штука, на которой спотыкаются даже опытные: сутки заканчиваются в полночь, а не в 23:59, и «сегодня» меняется в 00:00. Если вы в полночь тридцать минут спросите у now() дату, получите один день, а отнимете от неё час — уже другой. Для счётчиков «дней до дедлайна» это обычно безобидно, а вот в отчётах за период может дать сдвиг на строку. Обратная сторона: тот же now() в 23:59 и в 00:01 даёт две разные даты, хотя прошёл всего минута.
from datetime import datetime, timedelta
now = datetime(2026, 10, 21, 0, 30)
print(now.date())
print((now - timedelta(hours=1)).date())
2026-10-21 2026-10-20
from datetime import datetime
first = datetime(2026, 10, 21, 14, 30, 0, 100000)
second = datetime(2026, 10, 21, 14, 30, 0, 200000)
print(first == second)
print(second - first)
False 0:00:00.100000
Микросекунды в этом деле не экзотика: именно они делают возможным различать события внутри одной секунды — два запроса к базе за 40 миллисекунд, два входа в систему с интервалом в четверть секунды. Порядок событий в логах часто выстраивают именно по этому полю, потому что время с точностью до секунды для быстрых операций не годится.
Ещё один вопрос, который стоит закрыть сразу: local или UTC отдаёт now()? Отвечает локальная зона машины — тот часовой пояс, который настроен в системе. На сервере в Европе это может быть другой пояс, чем у пользователя в Москве, и тот же самый now() на двух машинах даст разные моменты. Про часовые пояса — отдельный урок 14, а пока держите в голове: datetime.now() без всяких дополнительных настроек означает «как настроены часы этой машины».
now() в коде: почему его результат нельзя зашивать в тест
Функция now() настолько естественна, что её результат рано или поздно попадает в тест или в сохранённые данные. И там он становится проблемой: значение, которое было правильным вчера, сегодня уже другое, и «сломанный» тест на самом деле проверяет не логику, а время.
Отсюда правило, которое стоит записать: если результат now() попадает в данные, которые должны быть стабильными, — вычисляйте «сейчас» один раз на границе программы и передавайте дальше явно. Тогда и тест, и лог будут воспроизводимы.
Второй приём — подмена «сейчас» на фиксированную дату в тестах: передавайте в функцию не datetime.now(), а конкретный момент. Это дешёвый рефакторинг, который превращает хрупкий тест в устойчивый.
Сначала предскажи ответ в голове — это главный навык программиста.
from datetime import date
today = date.today()
print(type(today))
from datetime import datetime
now = datetime(2026, 10, 23, 14, 37)
deadline = datetime(2026, 10, 25, 9, 0)
left = deadline - now
print(left.days)
from datetime import datetime
now = datetime(2026, 10, 21, 0, 30)
print(now.date())
print((now - datetime(2026, 10, 21, 0, 0)).days)
1. Что возвращает datetime.now()?
2. Чем date.today() отличается от datetime.now()?
3. Почему в проверяемых примерах курса не используется datetime.now()?
4. Что означает хвост .084521 в выводе datetime.now()?
5. В чём смысл приёма «подставная now»?
6. Почему в рабочем коде лучше передавать текущий момент в функцию аргументом?
7. Что вернёт выражение datetime.now() == datetime.now()?
8. Что вернёт date.today() для объекта класса datetime?
Закрепи приём «подставная now»: объяви now = 23 октября 2026 года, 14:37 и дедлайн = 1 ноября 2026 года, 12:00. Выведи обе даты и разницу — объект timedelta, который между ними.
Как получить текущую дату и время в Python?
datetime.now() — полный текущий момент с датой, временем и микросекундами; date.today() — только сегодняшняя дата. Оба возвращают объекты, у которых поля читаются через точку: .year, .month, .day, .hour, .minute.
Урок 3: now и todayЧем datetime.now() отличается от datetime.today()?
Без аргументов — ничем: today() возвращает тот же момент без часового пояса, что и now(). Историческое имя today() осталось в модуле, но привычный выбор современного кода — now(). Различия между методами появятся, когда речь дойдёт до часовых поясов.
Урок 14: часовые поясаПочему в обучающих примерах вместо now() пишут фиксированную дату?
Потому что вывод now() меняется при каждом запуске — его невозможно проверить. Приём «подставная now»: фиксированная дата в переменной с именем now делает код идентичным боевому, а вывод — воспроизводимым. В настоящем приложении заменяется одна строка.
Как получить только время без даты из datetime.now()?
Вызвать метод .time(): datetime.now().time() вернёт объект time с часами, минутами и секундами текущего момента. Извлечение частей момента разобрано в уроке 2.
Урок 2: date, time и datetimeКак проверить код, который считает дни до дедлайна?
Пусть функция принимает текущий момент аргументом: def days_until(target, now). Тогда вместо одного запуска с настоящим now() вы получаете столько проверок, сколько нужно — на две разные даты, на момент дедлайна, на границу суток. Сам datetime.now() вызывается в одном месте и подменяется в тестах.
В каком часовом поясе работает datetime.now()?
В локальной зоне машины, на которой запущен код: тот часовой пояс, что настроен в системе. На сервере за границей это может быть другой пояс, чем у пользователя. Если момент должен быть однозначным, к нему привязывают явную зону — про это урок про часовые пояса.
Урок 14: часовые поясаЧто значит микросекунды в выводе now()?
Это дробная часть секунды: now() знает момент точнее секунды, потому что системные часы отдают такое разрешение. Поле microsecond существует и у объектов без микросекунд — просто там ноль. Именно микросекунды позволяют различать события внутри одной секунды и выстраивать их порядок в логах.
Понравился урок? Сошлитесь на него
«Вывод меняется от запуска к запуску, поэтому в проверяемых примерах курса даты фиксированные, а «сейчас» подставляется переменной.»
Скопируйте готовую ссылку в формате HTML, Markdown или чистый адрес и вставьте в статью на Habr, VC, Telegram-канал или свой блог — так о проекте узнают новые читатели.
Что дальше
Осталось в разделе: 20 из 20. Прогресс хранится в вашем браузере.
Что читать дальше
Datetime · Урок 1
datetime в Python: первый момент времени
Дата как строка не умеет ничего: ни сравниться, ни посчитаться. Создаём первый объект datetime и разбираем его на поля — от года до секунды.
Datetime · Урок 2
date, time и datetime: три класса
День рождения без часов, будильник без календаря, лог-запись со всем сразу. Три класса модуля datetime — и правило, какой выбрать под задачу.
Datetime · Урок 6
timedelta: разница между моментами
«Срок подписки истекает через 7 дней», «событие было 3 часа назад» — за этим стоит timedelta. Вычитаем моменты, читаем дни и секунды, прибавляем разницу к датам.
Похожие уроки по темам
Подобраны автоматически по пересечению тем и ключевых слов.
openpyxl · Урок 9
Даты в Excel через openpyxl: запись, формат и арифметика
Пишем в ячейку настоящий datetime, показываем его по-русски маской DD.MM.YYYY и считаем дни между датами — а заодно узнаём, почему дату из файла нельзя сравнивать со строкой.
openpyxl дата в ячейкеexcel python дата
Pandas · Урок 9
Даты и временные ряды в Pandas: resample и rolling
Строки «01.07.2024» превращаются в настоящие даты, выручка агрегируется по неделям и месяцам через resample, а шум сглаживает rolling — строим тренд продаж магазина.
даты и время в pandas to_datetime примерыset_index datetime pandas
Datetime · Урок 13
timestamp: unix-время и эпоха 1970
Unix-время — число секунд с полуночи 1 января 1970 года по UTC. Считаем timestamp у aware-дат, переводим число обратно через fromtimestamp — и всегда указываем пояс.
unix время pythondatetime timestamp