Как получить текущую дату и время в Python
Текущая дата в Python получается одной строкой через date.today(), а дата вместе со временем через datetime.now(). Ниже показано, как вывести результат в привычном формате, взять время в UTC или нужном часовом поясе, получить timestamp и посчитать разницу между датами.

Содержание статьи
Сегодняшняя дата через date.today()
Класс date из стандартного модуля datetime хранит только год, месяц и день. Метод today() возвращает дату по локальным часам компьютера.
from datetime import date
today = date.today()
print(today) # например: 2026-10-31
print(type(today)) # <class 'datetime.date'>
print(today.year, today.month, today.day) # 2026 10 31При выводе через print() дата показывается в формате ISO 8601: год, месяц и день через дефис. Это не строка, а объект: у него есть атрибуты year, month, day и методы для сравнения и вычислений. Метод weekday() вернет номер дня недели, где понедельник это 0, а воскресенье 6.
Дата и время через datetime.now()
Если кроме даты нужны часы, минуты и секунды, используйте класс datetime. Метод now() возвращает момент вызова с точностью до микросекунд.
from datetime import datetime
now = datetime.now()
print(now) # 2026-10-31 14:05:27.318402
print(now.hour, now.minute, now.second) # 14 5 27
print(now.date()) # 2026-10-31
print(now.time()) # 14:05:27.318402Обратите внимание на импорт. Модуль и класс называются одинаково, поэтому при import datetime вызов пишется как datetime.datetime.now(), а при from datetime import datetime просто datetime.now(). Путаница между этими вариантами дает ошибку AttributeError: module 'datetime' has no attribute 'now'.
Время без микросекунд
Микросекунды редко нужны в логах и интерфейсе. Их можно обнулить методом replace() или сразу отформатировать строку.
from datetime import datetime
now = datetime.now().replace(microsecond=0)
print(now) # 2026-10-31 14:05:27
print(now.isoformat(sep=" ", timespec="minutes")) # 2026-10-31 14:05Вывод в нужном формате через strftime()
Метод strftime() превращает дату в строку по шаблону. Каждая директива с процентом заменяется на свою часть даты, остальные символы копируются как есть.
from datetime import datetime
now = datetime.now()
print(now.strftime("%d.%m.%Y")) # 31.10.2026
print(now.strftime("%d.%m.%Y %H:%M")) # 31.10.2026 14:05
print(now.strftime("%Y-%m-%d_%H-%M-%S")) # 2026-10-31_14-05-27
print(f"{now:%d.%m.%y}") # 31.10.26| Директива | Значение | Пример |
|---|---|---|
%d | День месяца, две цифры | 05 |
%m | Месяц, две цифры | 10 |
%Y / %y | Год из четырех / двух цифр | 2026 / 26 |
%H, %M, %S | Часы (00-23), минуты, секунды | 14, 05, 27 |
%A / %B | Название дня недели / месяца по локали | Saturday / October |
%j | Номер дня в году | 304 |
Последний пример с f-строкой работает потому, что объекты даты поддерживают те же директивы после двоеточия. Полный список кодов и обратное преобразование строки в дату описаны в статье про strftime в Python.
Месяц по-русски
Директивы %B и %A зависят от локали системы, и на большинстве серверов выдают английские названия. Менять локаль процесса ради одной строки неудобно, проще хранить названия в своем кортеже.
from datetime import date
MONTHS = ("января", "февраля", "марта", "апреля", "мая", "июня",
"июля", "августа", "сентября", "октября", "ноября", "декабря")
d = date(2026, 10, 31)
print(f"{d.day} {MONTHS[d.month - 1]} {d.year} г.") # 31 октября 2026 г.UTC и часовые пояса
Вызов datetime.now() без аргументов возвращает наивный объект: в нем нет информации о часовом поясе, только показания часов компьютера. Для серверов, логов и баз данных надежнее брать время в UTC и хранить его вместе с поясом.
from datetime import datetime, timezone
from zoneinfo import ZoneInfo
utc_now = datetime.now(timezone.utc)
print(utc_now) # 2026-10-31 11:05:27.318402+00:00
msk = datetime.now(ZoneInfo("Europe/Moscow"))
ny = datetime.now(ZoneInfo("America/New_York"))
print(msk.strftime("%H:%M %Z")) # 14:05 MSK
print(ny.strftime("%H:%M %Z")) # 07:05 EDTМетод datetime.utcnow() устарел с Python 3.12: он возвращает наивный объект, который легко принять за местное время. Используйте datetime.now(timezone.utc). Модуль zoneinfo встроен начиная с Python 3.9; на Windows ему нужна база поясов, которая ставится командой pip install tzdata. В старых проектах для той же задачи применяют сторонний модуль pytz.
Timestamp и модуль time
Для замеров и хранения часто нужен Unix timestamp: число секунд с 1 января 1970 года по UTC. Его возвращает функция time.time(), а datetime умеет переводить его туда и обратно.
import time
from datetime import datetime
ts = time.time()
print(ts) # 1793444727.318402
print(datetime.fromtimestamp(ts)) # 2026-10-31 14:05:27.318402
print(int(datetime.now().timestamp())) # 1793444727
print(time.strftime("%H:%M:%S", time.localtime())) # 14:05:27Модуль time удобен для пауз и измерения длительности, а для календарной арифметики лучше подходит datetime. Возможности первого собраны в обзоре модуля time.
Сравнение дат и подсчет дней
Объекты даты можно сравнивать операторами <, ==, > и вычитать друг из друга. Разность дает объект timedelta, у которого есть атрибут days.
from datetime import date, timedelta
today = date(2026, 10, 31)
new_year = date(today.year + 1, 1, 1)
print((new_year - today).days) # 62
print(today + timedelta(days=7)) # 2026-11-07
print(today - timedelta(weeks=1)) # 2026-10-24
print(today > date(2026, 1, 1)) # TrueСравнивать наивный datetime с объектом, у которого указан пояс, нельзя: Python выбросит TypeError. Подробно сложение, вычитание и перевод интервалов в часы разобраны в статье о timedelta, а все классы модуля описаны в документации datetime.
Частые вопросы
Ответы на вопросы, которые возникают при работе с текущей датой.
Чем date.today() отличается от datetime.now()?
Первый возвращает объект date только с днем, месяцем и годом. Второй возвращает datetime с часами, минутами, секундами и микросекундами. Если время не нужно, берите date.today().
Как получить дату вчера или завтра?
Прибавьте или вычтите timedelta(days=1): date.today() - timedelta(days=1) дает вчерашнюю дату с учетом смены месяца и года.
Почему время отличается от часов на сервере?
Скорее всего, сервер работает в UTC, а вы ожидаете московское время. Передайте пояс явно: datetime.now(ZoneInfo("Europe/Moscow")).
Как получить номер текущей недели?
Метод date.today().isocalendar() возвращает год, номер недели по ISO и день недели. Номер недели доступен как атрибут .week.