Модуль time в Python — руководство и примеры
Модуль time — встроенная библиотека Python для работы со временем: epoch, получением текущего времени, форматированием, задержками и простыми таймерами. В статье есть практические примеры, советы, контрольный чек-лист и краткий справочник по форматам strftime.

Введение
Модуль time предоставляет низкоуровневые функции для измерения времени, преобразования меток времени и простой задержки выполнения. Он входит в стандартную библиотеку Python, поэтому ничего дополнительно устанавливать не нужно: достаточно импортировать модуль.
Краткое определение: epoch — точка отсчёта (обычно 1 января 1970 г. в UNIX-системах). time.struct_time — структурированный объект, который возвращает компоненты даты и времени.
Быстрый старт
Импорт модуля выглядит так:
import timeПосле импорта доступны функции: time.time(), time.gmtime(), time.localtime(), time.ctime(), time.strftime(), time.sleep() и другие. Ниже — подробные примеры по каждой из часто используемых задач.
Как узнать базовую точку отсчёта (epoch)
По умолчанию в большинстве ОС epoch соответствует 1970-01-01 00:00:00 UTC. Это платформо-зависимо, но на Unix-подобных системах это стандарт.
Пример получения структуры для 0 секунды от epoch:
import time
default_base = time.gmtime(0)
print(default_base)
# Пример вывода:
# time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1,
# tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3,
# tm_yday=1, tm_isdst=0)Если вам нужно увидеть локальную интерпретацию epoch для вашей временной зоны:
import time
local_base = time.localtime(0)
print(local_base)Заметка: в летнее время (DST) час может отличаться от GMT.
Текущее время и дата
Получить текущее время в виде структуры можно с помощью gmtime() (UTC) или localtime() (локальное):
import time
current_utc = time.gmtime()
current_local = time.localtime()
print(current_utc)
print(current_local)Если необходимо простое представление метки времени — используйте time.time(), который возвращает число секунд (float) с дробной частью от epoch:
import time
now_seconds = time.time()
print("Время в секундах от epoch:", now_seconds)Чтобы приблизительно оценить, сколько лет прошло с epoch:
import time
years = round(time.time() / (3600 * 24 * 365))
print(f"Прошло примерно: {years} лет")Доступ к отдельным компонентам времени
time.struct_time поддерживает поля tm_year, tm_mon, tm_mday, tm_hour, tm_min, tm_sec и другие. Пример чтения текущего часа и года:
import time
lt = time.localtime()
hour = lt.tm_hour
minute = lt.tm_min
year = lt.tm_year
print(f"Локальное время: {hour} ч, {minute} мин, год {year}")human-readable формат: ctime и strftime
time.ctime() возвращает строку формата, удобную для вывода, но контролировать формат сложно:
import time
print(time.ctime())
# Пример: Sat Oct 2 13:58:07 2021Для детального форматирования используйте time.strftime(format, struct_time). Пример:
import time
lt = time.localtime()
formatted = time.strftime("%a, %d-%b-%Y, %I:%M %p", lt)
print("Дата и время:", formatted)
# Пример: Sat, 02-Oct-2021, 11:57 AMКороткая памятка: %a — сокращённое название дня, %d — день месяца, %b — сокращённое название месяца, %Y — год, %I — час в 12-часовом формате, %H — час в 24-часовом формате, %p — AM/PM в вашей локали.
Полный список спецификаторов форматирования см. в документации Python (strftime).
Задержка исполнения и таймеры: time.sleep()
time.sleep(sec) приостанавливает текущий поток на sec секунд (sec — число, int или float). Это удобно для простых планировок, ожидания ответов и реализации таймеров.
import time
print("Пауза 3 секунды...")
time.sleep(3)
print("После паузы")Важно: sleep блокирует текущий поток. В многопоточных приложениях потоки продолжают работать независимо, но в однопоточных программах sleep остановит всё выполнение.
Простой обратный отсчёт
Пример консольного обратного отсчёта, принимающего целое значение от пользователя:
import time
try:
n = int(input("Введите количество секунд для таймера: "))
except ValueError:
print("Нужно ввести целое число")
raise SystemExit(1)
for remaining in range(n, 0, -1):
print(f"Осталось: {remaining} сек", end="\r", flush=True)
time.sleep(1)
print("Время вышло! ")Этот код печатает обновляемую строку в консоли за счёт возврата каретки (\r) и flush=True.
Когда использовать time, а когда datetime и сторонние библиотеки
- time — отлично для меток, замеров производительности, простых задержек и работы с UNIX-временем (timestamp).
- datetime — удобнее для календарных вычислений (добавление дней/месяцев, сравнение дат, преобразование форматов) и для работы с timezone-aware объектами (особенно с zoneinfo в Python 3.9+).
- Для сложной работы с часовыми поясами используйте zoneinfo (встроен в Python 3.9+) или pytz/dateutil для старых версий.
Пример: лучше использовать datetime для сложных операций с датами:
from datetime import datetime, timedelta
now = datetime.now()
one_week = now + timedelta(days=7)
print(now.isoformat(), "->", none_week.isoformat())Практические советы и лучшие практики
- Для записи логов и метрик используйте time.time() (универсальный float timestamp). Он компактный и удобен для хранения.
- Для отображения пользователю — форматируйте через datetime и strftime, учитывая локаль и часовую зону.
- Не используйте time.sleep() для точного тайминга с миллисекундной точностью в критичных системах — лучше применять специализированные таймеры или event-loop (asyncio).
- В многопроцессных и многопоточных сценариях помните о блокирующем характере sleep.
- Тестируйте код, чувствительный ко времени, с использованием mock-объектов (например, freezegun) или отдельного слоя абстракции времени.
Короткий справочник по форматам strftime
- %Y — год с четырьмя цифрами (2021)
- %y — год без века (21)
- %m — месяц (01–12)
- %d — день месяца (01–31)
- %H — час (00–23)
- %I — час (01–12)
- %M — минуты (00–59)
- %S — секунды (00–59)
- %a — сокращённое название дня недели
- %A — полное название дня недели
- %b — сокращённое название месяца
- %B — полное название месяца
- %p — локальное AM/PM
Чек-лист для разработчика (роль: Backend-разработчик)
- Использую time.time() для метрик и таймстемпов
- Не полагаюсь на time.sleep() для тонкого планирования задач
- Для отображения даты пользователю использую strftime()/datetime
- Учёл часовой пояс и DST при необходимости
- Добавил тесты с моками времени для временно-зависимой логики
Критерии приёмки
- Временные метрики сохраняются в unix-timestamp (float).
- Пользовательский интерфейс показывает дату/время в ожидаемом формате.
- Задержки реализованы без блокирования критичных потоков.
- Поведение при переходе на летнее/зимнее время корректно обработано там, где это критично.
Мини-методология: как выбирать инструмент для задач со временем
flowchart TD
A[Нужны метки времени для логов?] -->|Да| B[Использовать time.time()]
A -->|Нет| C[Нужны календарные операции?]
C -->|Да| D[Использовать datetime]
C -->|Нет| E[Нужна синхронизация/задержка?]
E -->|Простая задержка| F[time.sleep()]
E -->|Низкая латентность или планирование| G[asyncio / scheduler / cron]flowchart TD
A[Нужны метки времени для логов?] -->|Да| B[Использовать time.time'']
A -->|Нет| C[Нужны календарные операции?]
C -->|Да| D[Использовать datetime]
C -->|Нет| E[Нужна синхронизация/задержка?]
E -->|Простая задержка| F[time.sleep'']
E -->|Низкая латентность или планирование| G[asyncio / scheduler / cron](Диаграмма помогает выбрать между time, datetime и асинхронными инструментами.)
Тестовые сценарии и приёмочные критерии
- Проверка: time.time() возвращает число (float) и увеличивается со временем.
- Проверка: time.strftime с заданным шаблоном возвращает строку ожидаемого формата.
- Проверка: обратный отсчёт корректно доходит до нуля и не создаёт лишних строк в логе.
- Проверка: перевод времени в локальную и UTC-зону даёт согласованные значения для известных меток.
Когда модуль time не подойдёт
- Нужно выполнять арифметику с календарными месяцами или годами (подходит datetime).
- Требуется корректная работа с часовыми поясами и переходами DST по историческим правилам (используйте zoneinfo/pytz).
- Требуется высокий уровень параллелизма и неблокирующее ожидание (используйте asyncio и loop.call_later).
Краткий глоссарий
- epoch — начальная точка отсчёта времени (обычно 1970-01-01 00:00:00 UTC)
- timestamp — количество секунд (обычно с дробной частью) от epoch
- time.struct_time — кортеж-подобный объект с компонентами даты/времени
- DST — переход на летнее/зимнее время (daylight saving time)
Резюме
Модуль time — лёгкий и быстрый инструмент для работы с низкоуровневыми временными метками, простыми задержками и форматированием времени. Для календарных операций и работы с часовыми поясами лучше комбинировать его с модулем datetime и новыми инструментами работы с зонами времени. Всегда учитывайте блокирующее поведение time.sleep() и тестируйте код, зависящий от времени, с заглушками.
Важное: если вам нужна точность и устойчивость к часовым поясам, планируйте миграцию на datetime + zoneinfo или используйте сторонние библиотеки для более старых версий Python.
Похожие материалы
Анализ тональности на Python с VADER и Tkinter
Проверить прокси в Windows
Темы рабочего стола в Ubuntu 18.04 LTS
Что делать, если Logitech G Pro Wireless не работает
Dev Drive в Windows 11 — как начать