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

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

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

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
Снова нередактируемый пример: today() возвращает настоящую сегодняшнюю дату, и вывод меняется от запуска к запуску. Читается этот блок как документация: так вызов выглядит в реальный день запуска.

Четыре лица текущего момента

СпособТип результатаЧто внутри
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() живёт в одном месте — там, где функцию зовут.

days_until.py — момент приходит снаружи
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 даёт две разные даты, хотя прошёл всего минута.

midnight.py — полночь делит сутки
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
two_now.py — два момента, разные микросекунды
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)
Проверь себя
0 / 8

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?

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

Закрепи приём «подставная now»: объяви now = 23 октября 2026 года, 14:37 и дедлайн = 1 ноября 2026 года, 12:00. Выведи обе даты и разницу — объект timedelta, который между ними.

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

Как получить текущую дату и время в 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-канал или свой блог — так о проекте узнают новые читатели.

TelegramVK

Что дальше

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

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

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