time — Доступ ко времени и конвертация
Модуль time предоставляет широкий спектр функций для работы со временем на уровне операционной системы. Хотя в современной разработке для оперирования датами предпочтителен объектно-ориентированный модуль datetime, модуль time остается фундаментальным для низкоуровневых операций, измерения производительности и системных пауз.
import time
Терминология и ключевые концепции
Для работы с модулем time нужно понимать базовые понятия:
- Эпоха (The Epoch): Точка отсчета времени для операционной системы. В Unix и Windows эпоха начинается 1 января 1970 года, 00:00:00 UTC.
- Unix таймстемп (Timestamp): Представление времени в виде числа с плавающей точкой, равного количеству секунд, прошедших с начала эпохи.
- UTC (Всемирное координированное время): Единый мировой стандарт времени, на котором базируются все часовые пояса.
- Локальное время (Local Time): Время с учетом вашего текущего часового пояса.
- DST (Летнее время): Смещение часового пояса на один час в летний период.
Класс struct_time
Многие функции в этом модуле возвращают или принимают объект time.struct_time. Это кортеж (именованный) из 9 элементов, который делает легким доступ к конкретным частям времени (год, месяц, минута).
| Индекс | Атрибут | Значения |
|---|---|---|
| 0 | tm_year |
например, 2024 |
| 1 | tm_mon |
1 до 12 |
| 2 | tm_mday |
1 до 31 (день месяца) |
| 3 | tm_hour |
0 до 23 (часы) |
| 4 | tm_min |
0 до 59 (минуты) |
| 5 | tm_sec |
0 до 61 (секунды, 60-61 для високосных секунд) |
| 6 | tm_wday |
0 до 6 (день недели, 0 - понедельник) |
| 7 | tm_yday |
1 до 366 (день в году) |
| 8 | tm_isdst |
-1, 0, 1 (флаг летнего времени) |
Пример использования:
import time
t = time.localtime()
print(f"Год: {t.tm_year}, Месяц: {t.tm_mon}, День: {t.tm_mday}")
print(f"День недели: {t.tm_wday} (где 0 - ПН)")
Получение текущего времени
1. time.time() и time.time_ns()
Возвращает текущее системное время в секундах с начала "эпохи".
import time
timestamp = time.time()
print(f"Секунд с эпохи Unix: {timestamp}") # например, 1705324500.123
# Начиная с Python 3.7 добавлена функция time_ns()
# Она возвращает наносекунды целым числом, избегая потери точности float
nanoseconds = time.time_ns()
print(f"Наносекунды: {nanoseconds}")
2. time.localtime([secs]) и time.gmtime([secs])
Обе функции конвертируют таймстемп в объект struct_time.
localtime()конвертирует с учетом вашего системного часового пояса.gmtime()конвертирует в мировое время UTC.
Если не передать аргумент secs, они возьмут текущее время (эквивалент time.time()).
import time
local = time.localtime()
print(f"Локальное время: {local.tm_hour}:{local.tm_min}")
utc = time.gmtime()
print(f"UTC время: {utc.tm_hour}:{utc.tm_min}")
# Конвертация конкретной отметки
t = time.localtime(1000000000) # 9 Сентября 2001
Управление выполнением: time.sleep()
Функция time.sleep(secs) блокирует текущий поток выполнения на заданное количество секунд. Поддерживаются дробные числа для миллисекундных пауз.
import time
print("Загрузка...")
time.sleep(2.5) # Программа "засыпает" на 2.5 секунды
print("Готово!")
Примечание: ОС не является системой реального времени, поэтому пауза может продлиться чуть дольше запрошенной, если процессор занят другими задачами.
Измерение производительности кода
При бенчмаркинге (измерении скорости работы кода) категорически не рекомендуется использовать time.time(). Системное время может быть синхронизировано через интернет по протоколу NTP прямо во время замера, из-за чего время может "прыгнуть" назад или вперед. Используйте специальные высокоточные таймеры:
1. time.perf_counter() (Рекомендуемый подход)
Счетчик с самым высоким разрешением, доступным ОС, предназначенный для измерения коротких промежутков. Учитывает время, которое программа "проспала" (sleep).
import time
start_time = time.perf_counter()
# Имитация тяжелой операции
total = sum(i * i for i in range(10_000_000))
end_time = time.perf_counter()
print(f"Вычисление заняло {end_time - start_time:.4f} секунд")
2. time.process_time()
Измеряет чистое процессорное время, потраченное текущим процессом (сумма system и user time). Он не включает в себя время, проведенное в состояниях ожидания или sleep. Оптимален для измерения чистой ресурсоемкости алгоритма.
import time
start = time.process_time()
time.sleep(2) # Время простоя не будет учтено!
end = time.process_time()
print(f"CPU время: {end - start:.4f} секунд") # Близко к 0.0000
3. time.monotonic()
"Монотонные" часы, которые гарантированно никогда не идут в обратную сторону. Идеально подходят для вычисления интервалов и проверки таймаутов, так как не подвержены корректировке системного времени.
Форматирование и парсинг времени
1. strftime(format, t)
Конвертирует объект struct_time t в строку, форматированную согласно правилам в строке format. (strftime = String Format Time)
import time
t = time.localtime()
# "2024-01-15 14:30:00"
print(time.strftime("%Y-%m-%d %H:%M:%S", t))
# Локализованный вывод: "Понедельник, 15 Января 2024"
print(time.strftime("%A, %d %B %Y", t))
Ключевые директивы:
%Y: Год с веком (2024)%y: Год без века (00..99)%m: Месяц (01..12)%B: Название месяца полностью (локализовано)%d: День месяца (01..31)%H: Часы в 24-часовом формате (00..23)%M: Минуты (00..59)%S: Секунды (00..59)
2. strptime(string, format)
Обратная операция. Конвертирует строку со временем обратно в объект struct_time на основе переданного формата. (strptime = String Parse Time)
import time
date_string = "21 Июнь, 2018"
# (должно соответствовать системной локали, если используются названия)
try:
result = time.strptime("21 06 2018", "%d %m %Y")
print(result.tm_year) # 2018
except ValueError as e:
print(f"Ошибка парсинга: {e}")
3. От struct к таймстемпу: time.mktime(t)
Принимает struct_time (в локальном часовом поясе) и конвертирует его в float таймстемп.
import time
t = time.strptime("2024-01-01 00:00:00", "%Y-%m-%d %H:%M:%S")
timestamp = time.mktime(t)
print(timestamp) # 1704067200.0
Работа с часовыми поясами (time.tzset())
В Unix-системах (Linux/macOS) можно динамически менять часовой пояс в рамках запущенного процесса, используя переменную окружения TZ в комбинации с функцией time.tzset().
import os
import time
# Запоминаем текущее время
print("Локально:", time.strftime('%X %x %Z'))
# Переключаемся на Нью-Йорк (Синтаксис зависит от ОС, типично для Linux/macOS)
os.environ['TZ'] = 'America/New_York'
try:
time.tzset()
print("В Нью-Йорке:", time.strftime('%X %x %Z'))
except AttributeError:
print("Функция time.tzset() недоступна на вашей платформе (например, Windows)")
Сводная таблица конвертаций
Шпаргалка для преобразований времени:
- Таймстемп → Локальный Struct:
time.localtime(ts) - Таймстемп → UTC Struct:
time.gmtime(ts) - Локальный Struct → Таймстемп:
time.mktime(t) - UTC Struct → Таймстемп: Используйте функцию
calendar.timegm(t)(из модуляcalendar) - Struct → Строка:
time.strftime(fmt, t) - Строка → Struct:
time.strptime(string, fmt)