Текущая дата и время в Python: datetime и time

Текущая дата и время в Python: datetime и time Полезное

Текущая дата и время в Python — это значения, которые возвращает функция datetime.now() из стандартного модуля datetime: объект с годом, месяцем, днем, часами, минутами, секундами и микросекундами на момент вызова. Отдельно дату берут через date.today(), а число секунд с начала эпохи Unix — через time.time().

Ниже разберу, как получить дату и время целиком и по частям, как привести их к нужному текстовому виду, как учесть часовой пояс и как перевести момент в метку времени Unix. Примеры проверены на Python 3.14 (актуальная стабильная версия на сентябрь 2026); код работает и на Python 3.9 и новее.

Быстрый старт: datetime.now()

Минимальный рабочий пример — импортировать класс datetime и вызвать now():

from datetime import datetime

now = datetime.now()
print(now)         # напр. 2026-09-16 14:30:05.123456 (у вас будут свои значения)
print(type(now))   # <class 'datetime.datetime'>

Строка from datetime import datetime выглядит непривычно: слева модуль datetime, справа класс datetime внутри него — это разные вещи с одинаковым именем. Функция now() возвращает объект класса datetime с датой и временем на момент вызова.

Конкретный вывод у вас будет другим — секунды и микросекунды не стоят на месте. Поэтому в примерах с now() я пишу «напр.», а точные значения показываю там, где момент задан явно.

Дата, время и datetime: три разных класса

В модуле datetime три основных класса, и путать их не стоит:

Класс Что хранит Пример значения
date год, месяц, день 2026-09-16
time часы, минуты, секунды, микросекунды 14:30:05.123456
datetime дату и время вместе 2026-09-16 14:30:05.123456

Объект datetime совмещает оба, поэтому из него легко достать и дату, и время по отдельности — об этом ниже.

Атрибуты доступны напрямую, каждый — обычное целое число:

from datetime import datetime

now = datetime.now()
print(now.year, now.month, now.day)       # напр. 2026 9 16
print(now.hour, now.minute, now.second)   # напр. 14 30 5

Только дата: date.today() и .date()

Получить текущую дату можно двумя способами. Первый — взять ее из объекта datetime методом date(). Второй — вызвать today() у класса date. Результат одинаковый:

from datetime import datetime, date

print(datetime.now().date())   # напр. 2026-09-16
print(date.today())            # напр. 2026-09-16

День недели дает метод weekday() или isoweekday(). Здесь легко ошибиться с нумерацией, поэтому запомните разницу: weekday() считает понедельник нулем, isoweekday() — единицей.

from datetime import date

d = date(2026, 9, 16)   # среда
print(d.weekday())      # 2  (понедельник = 0, вторник = 1, среда = 2)
print(d.isoweekday())   # 3  (понедельник = 1)

Только время: .time()

Текущее время без даты берут методом time() у объекта datetime:

from datetime import datetime

print(datetime.now().time())   # напр. 14:30:05.123456

Возвращается объект класса time. У него тоже есть отдельные атрибуты — hour, minute, second, microsecond, если нужны части времени по отдельности.

Форматирование: strftime

print(now) выводит дату в служебном виде (ISO 8601). Для интерфейса или отчета момент обычно приводят к своему формату методом strftime(). Он принимает строку-шаблон со спецификаторами и возвращает готовую строку.

Чтобы вывод был предсказуемым, зафиксирую конкретный момент — тогда результат не зависит от того, когда вы запустите код:

from datetime import datetime

moment = datetime(2026, 9, 16, 14, 30, 5)
print(moment.strftime("%d.%m.%Y"))          # 16.09.2026
print(moment.strftime("%H:%M:%S"))          # 14:30:05
print(moment.strftime("%d.%m.%Y %H:%M"))    # 16.09.2026 14:30

Часто используемые спецификаторы:

Шаблон Значение Пример
%Y год, 4 цифры 2026
%m месяц, 2 цифры 09
%d день, 2 цифры 16
%H часы, 24-часовой формат 14
%M минуты 30
%S секунды 05

Обратная операция — разобрать строку в объект datetime — делается методом strptime() с тем же языком шаблонов: datetime.strptime("16.09.2026", "%d.%m.%Y").

Другой часовой пояс

datetime.now() без аргументов возвращает «наивное» время — местное, без информации о поясе. Чтобы привязать момент к конкретной зоне, передайте пояс аргументом. С Python 3.9 для этого есть встроенный модуль zoneinfo — отдельная библиотека pytz больше не нужна:

from datetime import datetime, timezone
from zoneinfo import ZoneInfo

msk = datetime.now(ZoneInfo("Europe/Moscow"))
print(msk.strftime("%Y-%m-%d %H:%M %Z"))   # напр. 2026-09-16 14:30 MSK

utc = datetime.now(timezone.utc)
print(utc.strftime("%Y-%m-%d %H:%M %Z"))   # напр. 2026-09-16 11:30 UTC

Имена поясов берутся из базы IANA (Europe/Moscow, Asia/Novosibirsk, UTC и другие). Если zoneinfo не находит базу поясов (иногда бывает на Windows), поставьте пакет tzdata командой pip install tzdata.

Отдельно отмечу: метод datetime.utcnow() из старых примеров считается устаревшим начиная с Python 3.12. Вместо него используйте datetime.now(timezone.utc) — он возвращает время UTC с явно указанным поясом.

Метка времени Unix

Метка времени Unix (Unix timestamp) — это число секунд, прошедших с начала эпохи Unix, то есть с 00:00:00 UTC 1 января 1970 года. В таком виде время хранят и передают базы данных, протоколы и логи, потому что сравнивать и вычитать одно число проще, чем разбирать дату.

Текущую метку дает функция time.time() из модуля time — это число с плавающей точкой:

import time

print(time.time())   # напр. 1789640000.123456 (секунд с 1970-01-01 UTC)

Перевести конкретный момент в метку и обратно можно средствами datetime:

from datetime import datetime, timezone

ts = datetime(2026, 9, 16, 12, 0, tzinfo=timezone.utc).timestamp()
print(ts)                                        # 1789560000.0
print(datetime.fromtimestamp(ts, tz=timezone.utc))   # 2026-09-16 12:00:00+00:00

Для меток времени всегда задавайте пояс явно (tzinfo=timezone.utc): без него результат зависит от настроек машины, и одна и та же метка на разных серверах даст разное время.

Выводы

Текущий момент в Python получают через datetime.now(), отдельно дату — через date.today(), отдельно время — методом time(). Для вывода в нужном виде применяют strftime() с шаблоном, для часовых поясов — встроенный zoneinfo (а utcnow() больше не используют, его заменяет datetime.now(timezone.utc)). Метку времени Unix — число секунд с 1 января 1970 года — дает time.time(), и при переводе дат в метки пояс всегда задают явно.

Где это нужно на практике

Работа с датой и временем встречается почти в любой программе: отметки о создании записи в базе, расчет срока подписки, логирование событий, расписания и напоминания, замер времени выполнения кода. Умение получить текущий момент, привести его к нужному поясу и формату и перевести в метку Unix — базовый навык для бэкенда, анализа данных и автоматизации.

Освойте тему на практике

Разобраться с этим системно, вместе с остальными основами языка и практикой на реальных задачах, помогает курс Python-разработчик с нуля до Middle. Посмотреть формат занятий и темы вживую можно на открытых уроках Otus.

Смежные темы: циклы в Python, частые логические ошибки в коде.

FAQ

Чем datetime.now() отличается от datetime.today()?
Оба возвращают текущие дату и время. Разница в одном: now() умеет принять часовой пояс аргументом и вернуть время с привязкой к зоне, а today() всегда дает наивное местное время без пояса.

Как получить только год или только текущий месяц числом?
Обратитесь к атрибуту напрямую: datetime.now().year вернет год, datetime.now().month — номер месяца. Это обычные целые числа, с ними можно сразу считать.

Почему в метке времени time.time() есть дробная часть?
Функция возвращает секунды как число с плавающей точкой, и дробь — это доли секунды. Если нужна целая метка в секундах, приведите результат к int: int(time.time()).

OTUS Журнал
Скидка 5% 14-20 сентября на курсы (popup)