2025, Nov 16 03:02
Как получить текущий datetime в UTC и дату «сегодня» на 00:00 в Python
Как получить datetime в UTC с временной зоной: текущий момент и «сегодня» на 00:00. Примеры на Python с datetime.now, tzinfo=UTC и краткий вариант без combine.
Получить текущую дату в UTC как объект Python datetime с учётом часового пояса — распространённая задача, и стандартной библиотеки для этого достаточно: сторонние пакеты не нужны. Важно определиться, нужен ли точный текущий момент или «чистая» дата, нормализованная к полуночи по UTC, при этом результат должен оставаться экземпляром datetime.datetime.
Постановка задачи
Вам нужен datetime.datetime, представляющий «сегодня по UTC» в 00:00, а не наивная дата и не локальная метка времени. datetime.date.today() не подходит, потому что у него нет часового пояса, а datetime.datetime.today() включает часы, минуты и секунды. Типичный подход выглядит так:
import datetime as dts
utc_midnight = dts.datetime.combine(
dts.datetime.now(dts.UTC).date(),
dts.datetime.min.time(),
tzinfo=dts.UTC,
)
Этот код создаёт объект datetime с временной зоной, соответствующий 00:00:00 по UTC для текущих суток.
Что действительно важно
Главный выбор — нужен ли точный текущий момент по UTC или представление «только дата», привязанное к полуночи. datetime.now(tz=datetime.UTC) возвращает текущую метку времени в UTC как объект datetime с информацией о временной зоне. Если требуется только дата при сохранении типа datetime, извлеките год, месяц и день из этого объекта и создайте новый datetime на 00:00 по UTC.
Решение: получить текущий datetime в UTC
Чтобы получить текущие дату и время в UTC как объект datetime с временной зоной:
import datetime as dts
now_aware = dts.datetime.now(tz=dts.UTC)
print(now_aware, type(now_aware))
2025-09-23 12:57:59.065381+00:00 <class 'datetime.datetime'>
Решение: получить «сегодня по UTC» как datetime на 00:00
Если вам нужна только дата на сегодня по UTC, представленная как datetime в полночь:
import datetime as dts
stamp_utc = dts.datetime.now(tz=dts.UTC)
date_only_aware = dts.datetime(stamp_utc.year, stamp_utc.month, stamp_utc.day, tzinfo=dts.UTC)
print(date_only_aware, type(date_only_aware))
2025-09-23 00:00:00+00:00 <class 'datetime.datetime'>
Так вы сохраняете привязку к временной зоне и гарантируете соответствие началу суток по UTC.
Отметим, что указывать tzinfo при создании итогового datetime необязательно, если вам важна лишь числовая величина; однако это необходимо, если объект должен оставаться привязанным к временной зоне.
Почему это важно
Правильный подход помогает не смешивать непривязанные к зоне (naive) и привязанные (aware) значения и делает намерение очевидным. Вызов datetime.now(tz=datetime.UTC) показывает, что нужен UTC‑ориентированный timestamp. Пересоздание datetime на полуночь из года, месяца и дня даёт понять, что требуется значение «только дата», но всё ещё как datetime с контекстом UTC.
Итоги
Используйте datetime.now(tz=datetime.UTC), когда нужен текущий момент по UTC в виде datetime с временной зоной. Когда требуется «сегодня» по UTC, нормализованное к полуночи, создайте новый datetime из извлечённых года, месяца и дня с tzinfo=datetime.UTC. Если у вас уже работает вариант на базе combine, он тоже корректен; прямое создание просто короче и нагляднее. Сохраняйте tzinfo, если хотите оставить привязку к временной зоне.