
Объекты datetime в Python содержат точную информацию о дате и времени, включая год, месяц, день, часы, минуты, секунды и микросекунды. Однако в ряде задач удобнее оперировать числовыми значениями: хранить временные метки в базе данных, сравнивать их по величине или использовать в вычислениях. Для этого требуется преобразовать datetime в целое число.
Наиболее распространённый подход – перевод даты во временную метку Unix (количество секунд с 1 января 1970 года). Такой формат легко преобразуется в int с помощью метода datetime.timestamp() и функции int(). Например: int(dt.timestamp()). Этот вариант подходит для логирования, аналитики и работы с API, которые принимают значения времени в виде целых чисел.
Если необходимо получить не секунды, а более высокую точность, можно извлечь миллисекунды или микросекунды. Для этого используют атрибут datetime.microsecond или умножение значения timestamp() на 1000 или 1_000_000 с последующим преобразованием в int. Такой метод применяется при синхронизации событий и точных измерениях времени выполнения кода.
В случаях, когда важна только дата, без учёта времени, datetime можно привести к числу через форматирование. Например, int(dt.strftime("%Y%m%d")) создаст уникальное целое число вида 20250912. Это удобно при генерации ключей или индексов в хранилищах данных.
Получение Unix timestamp из объекта datetime

-
datetime.timestamp()возвращает число с плавающей точкой. Чтобы получить целое число, применяетсяint():import datetime dt = datetime.datetime(2023, 9, 12, 15, 30) ts = int(dt.timestamp()) print(ts) # например, 1694523000 -
Если объект
datetimeявляется «наивным» (не содержит информации о временной зоне), результат будет зависеть от локального времени. Для корректности лучше явно указывать UTC:import datetime dt = datetime.datetime(2023, 9, 12, 15, 30, tzinfo=datetime.timezone.utc) ts = int(dt.timestamp()) print(ts) -
Альтернативный способ через
time.mktime()работает только с локальным временем и не учитывает часовой пояс:import time import datetime dt = datetime.datetime(2023, 9, 12, 15, 30) ts = int(time.mktime(dt.timetuple())) print(ts)
Рекомендация: для работы с метками времени всегда указывайте tzinfo=datetime.timezone.utc, чтобы избежать ошибок при переводе между часовыми поясами.
Конвертация даты и времени в количество секунд
Для получения числового значения из datetime используют метод timestamp(), который возвращает количество секунд с начала эпохи Unix (01.01.1970 00:00:00 UTC).
Пример:
from datetime import datetime
dt = datetime(2023, 9, 12, 15, 30, 45)
seconds = int(dt.timestamp())
print(seconds)
Если нужно вычислить разницу между двумя моментами времени, применяется вычитание объектов datetime. Результат – объект timedelta, из которого можно получить секунды через total_seconds():
from datetime import datetime
start = datetime(2023, 9, 12, 12, 0, 0)
end = datetime(2023, 9, 12, 15, 30, 0)
diff_seconds = int((end - start).total_seconds())
print(diff_seconds)
Метод timestamp() подходит для абсолютного времени относительно эпохи, а total_seconds() – для интервальных вычислений.
Преобразование datetime в количество миллисекунд

В Python объект datetime можно преобразовать в количество миллисекунд, прошедших с 1 января 1970 года (Unix Epoch). Для этого используется метод timestamp(), возвращающий число секунд в виде числа с плавающей точкой.
Пример:
from datetime import datetime
dt = datetime(2023, 9, 12, 15, 30, 45, 123456)
milliseconds = int(dt.timestamp() * 1000)
print(milliseconds)
Результат – целое число, представляющее миллисекунды. Значение зависит от временной зоны: если объект datetime не содержит информации о tzinfo, он интерпретируется как локальное время. Чтобы избежать сдвигов, рекомендуется использовать datetime.utcfromtimestamp() или явно указывать tzinfo=timezone.utc.
Если требуется получить миллисекунды без привязки к эпохе, можно конвертировать только микросекунды внутри объекта:
ms_only = dt.microsecond // 1000
print(ms_only)
Такой способ возвращает миллисекундную часть времени, не включая дату и секунды.
Извлечение даты в виде целого числа формата YYYYMMDD

Для получения числа вида YYYYMMDD из объекта datetime достаточно воспользоваться методом strftime и последующим преобразованием в int:
import datetime
today = datetime.date.today()
date_int = int(today.strftime("%Y%m%d"))
В результате для даты 2025-09-12 будет получено значение 20250912.
При работе с datetime.datetime порядок действий аналогичен, но рекомендуется использовать .date() для отсечения времени:
now = datetime.datetime.now()
date_int = int(now.date().strftime("%Y%m%d"))
Такой подход гарантирует однозначное преобразование без учёта часового пояса и времени суток, что удобно для хранения дат в базе данных или формирования ключей.
Преобразование времени в целое число формата HHMMSS

Для получения целого числа в формате HHMMSS из объекта datetime.time можно использовать арифметическое преобразование компонентов времени. Например, если текущее время равно 14:35:07, то итоговое значение будет 143507.
Оптимальный способ:
value = t.hour * 10000 + t.minute * 100 + t.second
Здесь t – экземпляр datetime.time. Умножение на разряды исключает необходимость в строковых операциях и работает быстрее при массовой обработке.
Если используется datetime.datetime, доступ к времени осуществляется через атрибут .time() или напрямую через .hour, .minute, .second. Например:
ts = dt.hour * 10000 + dt.minute * 100 + dt.second
Работа с таймзонами при переводе datetime в int

При использовании метода timestamp() значение зависит от установленной таймзоны. Если объект datetime наивный (без tzinfo), результат будет рассчитан исходя из локальной системы, что может привести к сдвигу на несколько часов при переносе кода на сервер с другой настройкой.
Чтобы избежать несоответствий, всегда используйте явное указание таймзоны. Например, через модуль zoneinfo в Python 3.9+: datetime.now(ZoneInfo("UTC")). Полученное число будет отражать количество секунд от эпохи UNIX в универсальном времени.
Для преобразования локального времени в UTC используйте метод astimezone(ZoneInfo("UTC")) перед вызовом timestamp(). Это особенно важно при работе с расписаниями, логами и данными, поступающими из разных регионов.
Обратное преобразование int в datetime

Если число хранит количество секунд с начала эпохи Unix (01.01.1970 00:00:00 UTC), для восстановления даты применяется метод datetime.fromtimestamp(). При работе с миллисекундами или наносекундами требуется масштабирование значения.
Примеры преобразования:
| Формат числа | Действие | Код |
|---|---|---|
| Секунды | Прямое преобразование | datetime.fromtimestamp(1694515200) |
| Миллисекунды | Деление на 1000 | datetime.fromtimestamp(1694515200000 / 1000) |
| Наносекунды | Деление на 1_000_000_000 | datetime.fromtimestamp(1694515200000000000 / 1e9) |
Для сохранения часового пояса используйте datetime.fromtimestamp(value, tz=timezone.utc). Это особенно важно при работе с логами и данными из распределённых систем, где локальное время может отличаться.
Вопрос-ответ:
Почему при преобразовании datetime через timestamp() у меня результат отличается на несколько часов?
Скорее всего, проблема связана с часовым поясом. Объект `datetime` может быть «наивным» (без информации о зоне) или «осознанным» (с tzinfo). Если дата наивная, Python считает её локальной. Поэтому для точного результата лучше использовать модуль `pytz` или встроенный `zoneinfo` (с версии Python 3.9) и явно задавать часовой пояс.
Как в Python преобразовать объект datetime в целое число?
В Python объект datetime можно превратить в число несколькими способами. Один из распространённых методов — преобразовать дату в количество секунд с начала эпохи (обычно это 1 января 1970 года). Для этого используют метод timestamp(), который возвращает число с плавающей точкой. Если нужно целое значение, можно применить функцию int(). Например: import datetime; now = datetime.datetime.now(); timestamp_int = int(now.timestamp()). В результате получится число, которое удобно использовать для хранения, сравнения или передачи в базы данных.
Можно ли сохранить дату в виде числа без потери информации о времени?
Да, но способ зависит от требуемой точности. Если важно сохранить дату и время до секунд, обычно используют количество секунд с начала эпохи, как описано через timestamp(). Если нужна точность выше секунды, например до миллисекунд или микросекунд, можно умножить значение timestamp на 1000 или 1_000_000 и затем преобразовать в целое. При этом важно помнить, что при обратном преобразовании в datetime нужно будет делить на тот же множитель, чтобы восстановить исходное значение времени. Этот метод позволяет хранить временные метки в виде чисел без потери точности, подходя для сортировки или передачи между системами.
