43.5 Время суток

В этом разделе объясняется, как определить текущее время и часовой пояс.

Многие функции, такие как current-time и file-attributes, возвращают значения временной метки Lisp, которые подсчитывают секунды и могут представлять абсолютное время, подсчитывая секунды с эпохи 1970-01-01 00:00:00 UTC (Всемирное координированное время). Обычно эти подсчеты игнорируют високосные секунды; однако GNU и некоторые другие операционные системы могут быть настроены на подсчет високосных секунд.

Хотя традиционно временные метки Lisp представляли собой целочисленные пары, их форма эволюционировала, и программы обычно не должны зависеть от текущей по умолчанию формы. Если вашей программе требуется определенная форма временной метки, вы можете использовать функцию time-convert для ее преобразования в необходимую форму. См. Преобразование времени.

В настоящее время существует три формы временных меток Lisp, каждая из которых представляет количество секунд:

Аргументы функций, например, аргумент time функции format-time-string, принимают более общий формат значения времени, которым может быть временная метка Lisp, nil для текущего времени, конечное число с плавающей запятой для секунд или список (high low micro) или (high low), который является усеченным списком временной метки с пропущенными элементами, принятыми равными нулю.

Значения времени могут преобразовываться в календарные и другие формы. Некоторые из этих преобразований зависят от функций операционной системы, которые ограничивают диапазон возможных значений времени и сигнализируют об ошибке, такой как «"Указанное время не может быть представлено"», если превышаются пределы. Например, система может не поддерживать временные метки до эпохи или годы далеко в будущем. Вы можете преобразовать значение времени в строку, читаемую человеком, с помощью format-time-string, в временную метку Lisp с помощью time-convert и в другие формы с помощью decode-time и float-time. Эти функции описаны в следующих разделах.

Функция: current-time-string &опциональный часовой пояс

Эта функция возвращает текущее время и дату в виде строки, читаемой человеком. Формат не меняется для начальной части строки, которая содержит день недели, месяц, день месяца и время суток в таком порядке: количество символов, используемых для этих полей, всегда одинаково, хотя (если вам не требуются аббревиатуры дней недели или месяцев на английском независимо от локали) обычно удобнее использовать format-time-string, чем извлекать поля из вывода current-time-string, поскольку год может не иметь ровно четырех цифр, и в конце в будущем могут быть добавлены дополнительные сведения.

Аргумент time, если он указан, определяет время для форматирования, вместо текущего времени. Опциональный аргумент zone по умолчанию соответствует текущему правилу часового пояса. См. Правила часовых поясов. Операционная система ограничивает диапазон значений времени и часового пояса.

(current-time-string)
     ⇒ "Fri Nov  1 15:59:49 2019"
Переменная: current-time-list

Эта булева переменная является вспомогательным средством перехода. Если t, current-time и связанные функции возвращают временные метки в виде списка, обычно (high low micro pico); в противном случае они используют форму (ticks . hz). В настоящее время эта переменная по умолчанию равна t для совместимости с предыдущими версиями Emacs. Разработчикам рекомендуется тестировать код, связанный с временными метками, при установке этой переменной в nil, поскольку в будущей версии Emacs она по умолчанию будет равна nil и будет удалена в какой-то последующей версии.

Функция: current-time

Эта функция возвращает текущее время в виде временной метки Lisp. Если current-time-list равно nil, временная метка имеет форму (ticks . hz), где ticks подсчитывает такты часов, а hz — такты часов в секунду. В противном случае временная метка имеет списковую форму (high low usec psec). Вы можете использовать (time-convert nil t) или (time-convert nil 'list) для получения определенной формы независимо от значения current-time-list. См. Преобразование времени.

Функция: float-time &опциональное время

Эта функция возвращает текущее время в виде числа с плавающей запятой секунд с момента эпохи. Опциональный аргумент time, если указан, определяет время для преобразования вместо текущего времени.

Предупреждение: Поскольку результат является числом с плавающей запятой, он может быть неточным. Не используйте эту функцию, если требуются точные временные метки. Например, в типичных системах (float-time '(1 . 10)) отображается как «0.1», но немного больше 1/10.

time-to-seconds является псевдонимом для этой функции.

Функция: current-cpu-time

Возвращает текущее время ЦПУ вместе с его разрешением. Возвращаемое значение — пара (CPU-TICKS . TICKS-PER-SEC). Счетчик CPU-TICKS может переполняться, поэтому значения не могут быть осмысленно сравнены, если между ними прошло слишком много времени.