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, если хотите оставить привязку к временной зоне.