
Модуль datetime предоставляет класс datetime.datetime, объединяющий дату и время в одном объекте. Например, вызов datetime.datetime.now() возвращает текущие значения с точностью до микросекунд. Для операций с временными интервалами используется объект timedelta, который поддерживает прибавление или вычитание дней, часов и секунд.
Если требуется низкоуровневый доступ к системному времени, применяется модуль time. Он предоставляет функцию time.time(), возвращающую количество секунд с 1 января 1970 года. Такой подход полезен для измерения производительности кода.
Работа с календарными вычислениями реализована через модуль calendar. Он позволяет определить високосный год, узнать количество дней в месяце или сгенерировать текстовое представление календаря. Эти возможности удобны при разработке приложений, связанных с планированием и расписаниями.
Получение текущей даты и времени
Для работы с текущим временем применяется модуль datetime. Базовый вызов: from datetime import datetime.
Текущая дата и время: datetime.now(). Пример: print(datetime.now()) вернёт объект с точностью до микросекунд.
Только дата: datetime.today().date(). Только время: datetime.now().time().
Универсальное время (UTC): datetime.utcnow(). Это полезно при работе с логами и сетевыми сервисами.
Для форматирования применяют метод strftime. Пример: datetime.now().strftime("%Y-%m-%d %H:%M:%S") выдаст строку вида 2025-09-14 12:45:33.
Рекомендуется всегда указывать часовой пояс через модуль zoneinfo (Python 3.9+): from zoneinfo import ZoneInfo, затем datetime.now(ZoneInfo("Europe/Moscow")).
Форматирование даты и времени с помощью strftime
Метод strftime() модуля datetime позволяет представить дату и время в строковом виде с использованием специальных кодов формата.
Примеры часто используемых спецификаторов:
%Y– год в формате из четырёх цифр (2025)%y– год в формате из двух цифр (25)%m– месяц с ведущим нулём (01–12)%d– день месяца с ведущим нулём (01–31)%H– час в 24-часовом формате (00–23)%I– час в 12-часовом формате (01–12)%M– минуты (00–59)%S– секунды (00–59)%A– полное название дня недели%B– полное название месяца
Пример использования:
from datetime import datetime
now = datetime.now()
print(now.strftime("%d.%m.%Y %H:%M:%S"))
print(now.strftime("%A, %d %B %Y"))
Рекомендации:
- Для журналирования удобно
%Y-%m-%d %H:%M:%S. - Для пользовательского интерфейса подбирайте локализованные форматы, например
%d.%m.%Yдля русскоязычных приложений. - Для времени без секунд используйте
%H:%M.
Преобразование строк в объекты datetime через strptime

Метод datetime.strptime() позволяет создать объект datetime из строки, если формат строки указан явно. Этот способ нужен, когда данные приходят в текстовом виде: из файлов журналов, CSV, API или пользовательского ввода.
Сигнатура: datetime.strptime(date_string, format). Первый аргумент – строка, второй – шаблон разбора, где используются спецификаторы формата: %Y – год, %m – месяц, %d – день, %H – часы, %M – минуты, %S – секунды.
Пример:
from datetime import datetime
dt = datetime.strptime("14-09-2025 18:45", "%d-%m-%Y %H:%M")
В результате получится объект datetime с датой 14 сентября 2025 года и временем 18:45.
Частые ошибки: несовпадение формата и строки. Например, при строке "2025/09/14" шаблон должен быть "%Y/%m/%d", иначе вызов завершится исключением ValueError.
Рекомендации:
- Всегда проверяйте входные данные перед преобразованием, чтобы избежать сбоев.
- Для неоднородных строк используйте обработку исключений (
try/except). - Если требуется поддержка разных форматов, комбинируйте несколько попыток разбора.
Арифметика с датами и временем (timedelta)

Объект datetime.timedelta описывает разницу между двумя моментами времени с точностью до микросекунд. Он хранит три параметра: days, seconds и microseconds. Внутреннее представление всегда нормализовано: например, 90 секунд будет преобразовано в 1 минуту и 30 секунд.
Создание объекта:
from datetime import timedelta
delta = timedelta(days=2, hours=5, minutes=30)
print(delta) # 2 days, 5:30:00
Прибавление и вычитание:
from datetime import datetime, timedelta
now = datetime.now()
new_time = now + timedelta(days=7)
past_time = now - timedelta(hours=12)
Разность дат:
d1 = datetime(2025, 9, 14, 12, 0)
d2 = datetime(2025, 9, 10, 8, 0)
delta = d1 - d2
print(delta.days, delta.seconds // 3600) # 4 4
Сравнение:
td1 = timedelta(days=3)
td2 = timedelta(days=2, hours=20)
print(td1 > td2) # True
Математические операции возможны с целыми числами:
td = timedelta(hours=6)
print(td * 4) # 1 day, 0:00:00
print(td / 2) # 3:00:00
Для извлечения значений используйте свойства:
td = timedelta(days=5, hours=3, minutes=15)
print(td.days) # 5
print(td.seconds // 3600) # 3
Измерение времени выполнения кода

Для анализа производительности в Python чаще всего используют модуль time и timeit. Они решают разные задачи: первый подходит для быстрых замеров, второй – для точных измерений с учётом многократного запуска.
- time.perf_counter() – возвращает время с высокой точностью. Подходит для измерения небольших фрагментов кода.
- timeit.timeit() – выполняет код заданное число раз и усредняет результат, что исключает влияние случайных факторов.
Пример использования time.perf_counter():
import time
start = time.perf_counter()
result = sum(range(10_000_000))
end = time.perf_counter()
print(f"Время: {end - start:.6f} сек.")
Пример с timeit для повторных запусков:
import timeit
code = "sum(range(10_000_000))"
t = timeit.timeit(stmt=code, number=5)
print(f"Среднее время: {t / 5:.6f} сек.")
- Использовать
time.perf_counter(), когда важен замер одного конкретного участка. - Применять
time.process_time()для оценки загрузки CPU. - Выбирать
timeit, если нужна репрезентативная статистика при повторных прогонах.
Работа с часовыми поясами и модуль zoneinfo
Модуль zoneinfo появился в Python 3.9 и заменяет сторонние решения вроде pytz. Он использует системную базу данных IANA для работы с часовыми поясами, обеспечивая корректное учёты переходов на летнее/зимнее время.
Создание объекта часового пояса осуществляется через класс ZoneInfo:
from zoneinfo import ZoneInfo
tz = ZoneInfo("Europe/Moscow")
Для привязки часового пояса к объекту datetime используется аргумент tzinfo:
from datetime import datetime
dt = datetime(2025, 9, 14, 12, 0, tzinfo=ZoneInfo("Europe/Moscow"))
Преобразование времени между часовыми поясами выполняется методом astimezone():
dt_utc = dt.astimezone(ZoneInfo("UTC"))
Рассмотрим сравнительную таблицу для основных операций с zoneinfo:
| Операция | Пример | Описание |
|---|---|---|
| Создание часового пояса | ZoneInfo("America/New_York") |
Инициализация объекта часового пояса по стандарту IANA |
| Привязка к datetime | datetime(2025,9,14,12,0,tzinfo=ZoneInfo("Europe/Moscow")) |
Создаёт объект времени с конкретным часовым поясом |
| Преобразование в другой пояс | dt.astimezone(ZoneInfo("Asia/Tokyo")) |
Перевод времени в другой часовой пояс с учётом DST |
| Получение текущего времени в поясе | datetime.now(ZoneInfo("Europe/London")) |
Возвращает текущее локальное время для выбранного региона |
| Список доступных зон | import zoneinfo; zoneinfo.available_timezones() |
Возвращает множество всех поддерживаемых названий зон |
Рекомендуется всегда использовать объекты datetime с tzinfo, чтобы избежать ошибок при сравнении времени из разных регионов. Для временных вычислений лучше применять UTC и затем переводить в локальный пояс через astimezone(). Это исключает несоответствия при переходах на летнее/зимнее время.
Модуль zoneinfo не требует установки сторонних библиотек и синхронизируется с системной базой tzdata. Для корректного отображения часовых поясов на Linux следует убедиться, что пакет tzdata актуален.
Сравнение объектов datetime и сортировка по времени
В Python объекты datetime.datetime можно сравнивать напрямую с помощью стандартных операторов: <, <=, ==, !=, >=, >. Сравнение учитывает год, месяц, день, час, минуту, секунду и микросекунду. Например, datetime(2025, 9, 14, 12, 0) < datetime(2025, 9, 14, 15, 30) вернёт True.
Для сортировки списков объектов datetime применяется функция sorted() или метод list.sort(). По умолчанию сортировка идёт от самой ранней даты к самой поздней. Например, sorted([d1, d2, d3]) вернёт упорядоченный список по возрастанию времени.
Если требуется сортировка в обратном порядке, используют параметр reverse=True: sorted([d1, d2, d3], reverse=True). Для сортировки по отдельному атрибуту, например, только по часу или дню недели, применяют ключевую функцию: sorted(dates, key=lambda x: x.hour).
Сравнение объектов с разными зонами времени требует приведения к одной временной зоне. Используется метод astimezone() для согласования: dt1.astimezone(tz) < dt2.astimezone(tz). Без приведения возможны некорректные результаты при сравнении UTC и локального времени.
При работе с большими массивами данных для сортировки по времени рекомендуется использовать numpy.datetime64 или pandas.Timestamp, так как они обеспечивают более высокую производительность и позволяют применять векторизованные операции сравнения и фильтрации.
Вопрос-ответ:
Как в Python получить текущее время и дату?
Для получения текущих даты и времени в Python используют модуль datetime. Основной метод — datetime.datetime.now(), который возвращает объект datetime с текущей датой и временем. Например: import datetime; datetime.datetime.now(). Для работы только с датой можно использовать datetime.date.today(), а только с временем — datetime.datetime.now().time(). Эти объекты позволяют легко форматировать дату или извлекать отдельные части, такие как год, месяц или час.
Чем отличается модуль time от datetime?
Модуль time предназначен для работы с временем на уровне секунд и таймеров, он предоставляет функции вроде time.time(), которая возвращает количество секунд с 1 января 1970 года, и time.sleep(), чтобы приостановить выполнение программы. Модуль datetime больше ориентирован на работу с календарными датами и временем, поддерживает удобное создание объектов даты и времени, сложение и вычитание дат, форматирование строк. В общем, time удобен для измерения интервалов, а datetime — для управления и отображения календарных значений.
Как преобразовать строку с датой в объект datetime?
Для преобразования строки в объект datetime используют метод datetime.strptime(). Он принимает два аргумента: строку с датой и формат, который описывает структуру этой строки. Например, если строка "2025-09-14 15:30", то преобразовать её можно так: datetime.datetime.strptime("2025-09-14 15:30", "%Y-%m-%d %H:%M"). После этого с объектом можно выполнять арифметические операции, сравнивать даты или извлекать отдельные компоненты.
Как вычислить разницу между двумя датами в Python?
Разница между датами вычисляется с помощью объектов timedelta из модуля datetime. Если у вас есть два объекта datetime, например, start и end, то delta = end - start создаст объект timedelta. У него есть атрибуты days, seconds и microseconds, которые позволяют узнать, сколько дней, секунд или микросекунд прошло. Также можно получить общее количество секунд через delta.total_seconds(). Этот метод полезен для подсчета продолжительности событий или интервалов времени.
Можно ли учитывать часовые пояса при работе с датой и временем в Python?
Да, Python поддерживает работу с часовыми поясами через модуль datetime и библиотеку pytz. Встроенные объекты datetime могут быть «наивными» (без информации о часовой зоне) или «осведомленными» (aware), с информацией о часовом поясе. Например, чтобы создать aware-объект для Москвы: import pytz; moscow = pytz.timezone("Europe/Moscow"); datetime.datetime.now(moscow). Это важно при работе с приложениями, которые обрабатывают пользователей из разных регионов, чтобы время отображалось корректно и интерпретировалось правильно.
