Модуль time
Функции для работы с временем
Модуль time работает с календарным временем контроллера и миллисекундным счётчиком. Эпоха этой прошивки — 1 января 1970 года, 00:00:00 UTC. Часовой пояс задаётся в настройках контроллера; функции модуля его не изменяют. Автоматического перехода на летнее время нет.
Календарное время
time
time.time()
time.time(field)
Без аргумента возвращает целое число секунд Unix UTC. Точность результата — одна секунда; правильность календарной даты зависит от настройки RTC и синхронизации времени контроллера.
Дополнительная форма time(field) возвращает одно поле местного времени RTC. Допустимы строки year, month, day, hour, min, sec, weekday, без учёта регистра. weekday — от 0 (понедельник) до 6 (воскресенье). Неизвестное имя вызывает ValueError.
import time
print(time.time())
print(time.time('hour'))
gmtime
time.gmtime([secs]) возвращает дату и время UTC.
localtime
time.gmtime([secs])
time.localtime([secs])
Преобразуют целое число секунд Unix в кортеж из восьми элементов:
(год, месяц, день, час, минута, секунда, день_недели, день_года)
Месяц — 1…12, день — 1…31, час — 0…23, минуты и секунды — 0…59, день недели — 0…6 (понедельник…воскресенье), день года — 1…366.
gmtime возвращает UTC. localtime прибавляет настроенное смещение часового пояса. Если аргумент отсутствует или равен None, используется текущее время. Явный secs должен быть целым в диапазоне 0…4294967295; вне этого диапазона возникает OverflowError, при неверном типе — TypeError. Последняя допустимая отметка UTC — 7 февраля 2106 года, 06:28:15.
import time
assert time.gmtime(0)[:6] == (1970, 1, 1, 0, 0, 0)
print('UTC:', time.gmtime())
print('Местное время:', time.localtime())
mktime
time.mktime(date)
Обратное преобразование для localtime: принимает список или кортеж из 8 либо 9 элементов в местном времени и возвращает целое число секунд Unix UTC. Используются первые шесть полей; остальные игнорируются. Передавать результат gmtime без поправки часового пояса нельзя.
import time
stamp = 1700000000
assert time.mktime(time.localtime(stamp)) == stamp
tomorrow = list(time.localtime(stamp))
tomorrow[2] += 1
assert time.mktime(tomorrow) == stamp + 86400
Функция нормализует переносы между секундами, минутами, часами, днями и месяцами. Чтобы ограничить время нормализации, входные компоненты ограничены: год 1969…2106, месяц −120…120, день −3660…3660, час −2400…2400, минута и секунда −100000…100000. Это пределы входных значений, а не обычные диапазоны календаря. При выходе за них возникает ValueError; если итоговая отметка вне 0…4294967295 — OverflowError.
Задержки
sleep
time.sleep(seconds)
Принимает целое число или float, в том числе дробные секунды. Задержка переводится в миллисекунды с отбрасыванием дробной части. Результат перевода должен быть в диапазоне 0…4294967295 мс. Отрицательные значения, NaN и бесконечность вызывают ValueError.
sleep_ms
time.sleep_ms(ms)
Задержка в целых миллисекундах. Используйте 0…2147483647; ноль возвращает управление без ожидания. Отрицательное значение в текущей реализации также возвращает управление без задержки.
import time
time.sleep(0.25)
time.sleep_ms(250)
Задержки выполняются с участием FreeRTOS; фактическое ожидание зависит от планирования задач. Это не средство задания точных импульсов.
Измерение интервалов
ticks_ms
time.ticks_ms() возвращает циклический миллисекундный счётчик 0…1073741823. Период — 2³⁰ мс. Это не календарное время; значение нельзя сравнивать с time.time().
ticks_diff
time.ticks_diff(end, start) вычисляет знаковую разность с учётом перехода счётчика через ноль. Передавайте значения от ticks_ms или ticks_add. Результат однозначен для интервалов меньше половины периода, то есть 2²⁹ мс. Простое вычитание и сравнение тиков через переполнение использовать не следует.
ticks_add
time.ticks_add(ticks, delta) прибавляет целое число миллисекунд с учётом периода. Требуется −2²⁹ < delta < 2²⁹; иначе возникает OverflowError.
import time
start = time.ticks_ms()
time.sleep_ms(100)
print(time.ticks_diff(time.ticks_ms(), start))
deadline = time.ticks_add(time.ticks_ms(), 500)
while time.ticks_diff(deadline, time.ticks_ms()) > 0:
time.sleep_ms(10)
В этой прошивке нет sleep_us, ticks_us, ticks_cpu и time_ns.