Гид по технологиям

Модуль time в Python — руководство и примеры

6 min read Python Обновлено 05 Dec 2025
Модуль time в Python — руководство и примеры
Модуль 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.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Анализ тональности на Python с VADER и Tkinter
Обработка текста

Анализ тональности на Python с VADER и Tkinter

Проверить прокси в Windows
Безопасность

Проверить прокси в Windows

Темы рабочего стола в Ubuntu 18.04 LTS
Linux

Темы рабочего стола в Ubuntu 18.04 LTS

Что делать, если Logitech G Pro Wireless не работает
Техподдержка

Что делать, если Logitech G Pro Wireless не работает

Dev Drive в Windows 11 — как начать
Разработка

Dev Drive в Windows 11 — как начать

Как сбросить и перезапустить OneDrive в Windows 10
Windows 10

Как сбросить и перезапустить OneDrive в Windows 10