В этом разделе объясняется, как определить текущее время и часовой пояс.
Многие функции, такие как current-time и file-attributes,
возвращают значения временной метки Lisp, которые подсчитывают секунды и могут
представлять абсолютное время, подсчитывая секунды с эпохи 1970-01-01 00:00:00 UTC (Всемирное координированное время). Обычно эти
подсчеты игнорируют високосные секунды; однако GNU и некоторые другие операционные
системы могут быть настроены на подсчет високосных секунд.
Хотя традиционно временные метки Lisp представляли собой целочисленные пары, их
форма эволюционировала, и программы обычно не должны зависеть от текущей
по умолчанию формы. Если вашей программе требуется определенная форма временной
метки, вы можете использовать функцию time-convert для ее
преобразования в необходимую форму. См. Преобразование времени.
В настоящее время существует три формы временных меток Lisp, каждая из которых представляет количество секунд:
(ticks . hz), где hz
положительно. Это представляет ticks/hz секунды, что
совпадает со временем в простом ticks, если hz равно 1.
Распространенное значение для hz — 1000000000 для часов с
наносекундной точностью.
(high low micro
pico), где 0≤low<65536,
0≤micro<1000000 и 0≤pico<1000000.
Это представляет количество секунд по формуле:
high * 2**16 + low + micro * 10**−6 +
pico * 10**−12.
Если current-time-list равно t,
некоторые функции могут по умолчанию возвращать списки из двух или
трех элементов, при этом пропущенные компоненты micro и pico
по умолчанию равны нулю.
На всех текущих машинах pico является кратным 1000, но это
может измениться по мере появления часов с более высокой точностью.
Аргументы функций, например, аргумент time функции
format-time-string, принимают более общий формат значения времени,
которым может быть временная метка Lisp, nil для текущего
времени, конечное число с плавающей запятой для секунд или список
(high low micro) или (high
low), который является усеченным списком временной метки с
пропущенными элементами, принятыми равными нулю.
Значения времени могут преобразовываться в календарные и другие формы.
Некоторые из этих преобразований зависят от функций операционной системы, которые
ограничивают диапазон возможных значений времени и сигнализируют об ошибке, такой как
«"Указанное время не может быть представлено"», если
превышаются пределы. Например, система может не поддерживать
временные метки до эпохи или годы далеко в будущем.
Вы можете преобразовать значение времени в
строку, читаемую человеком, с помощью format-time-string, в
временную метку Lisp с помощью time-convert и в другие формы с
помощью decode-time и float-time. Эти
функции описаны в следующих разделах.
Эта функция возвращает текущее время и дату в виде строки,
читаемой человеком. Формат не меняется для начальной части строки,
которая содержит день недели, месяц, день месяца и время суток в таком
порядке: количество символов, используемых для этих полей, всегда одинаково,
хотя (если вам не требуются аббревиатуры дней недели или месяцев на английском
независимо от локали) обычно удобнее использовать format-time-string,
чем извлекать поля из вывода current-time-string, поскольку год
может не иметь ровно четырех цифр, и в конце в будущем могут быть добавлены
дополнительные сведения.
Аргумент time, если он указан, определяет время для форматирования, вместо текущего времени. Опциональный аргумент zone по умолчанию соответствует текущему правилу часового пояса. См. Правила часовых поясов. Операционная система ограничивает диапазон значений времени и часового пояса.
(current-time-string)
⇒ "Fri Nov 1 15:59:49 2019"
Эта булева переменная является вспомогательным средством перехода. Если t,
current-time и связанные функции возвращают временные метки в виде списка,
обычно (high low micro pico);
в противном случае они используют форму (ticks . hz). В настоящее
время эта переменная по умолчанию равна t для совместимости с
предыдущими версиями Emacs. Разработчикам рекомендуется тестировать код, связанный с
временными метками, при установке этой переменной в nil, поскольку в
будущей версии Emacs она по умолчанию будет равна nil и будет удалена
в какой-то последующей версии.
Эта функция возвращает текущее время в виде временной метки Lisp.
Если current-time-list равно nil,
временная метка имеет форму (ticks . hz), где
ticks подсчитывает такты часов, а hz — такты часов в секунду.
В противном случае временная метка имеет списковую форму
(high low usec psec).
Вы можете использовать (time-convert nil t) или (time-convert nil 'list)
для получения определенной формы независимо от значения
current-time-list. См. Преобразование времени.
Эта функция возвращает текущее время в виде числа с плавающей запятой секунд с момента эпохи. Опциональный аргумент time, если указан, определяет время для преобразования вместо текущего времени.
Предупреждение: Поскольку результат является числом с плавающей
запятой, он может быть неточным. Не используйте эту функцию, если требуются
точные временные метки. Например, в типичных системах (float-time '(1 . 10))
отображается как «0.1», но немного больше 1/10.
time-to-seconds является псевдонимом для этой функции.
Возвращает текущее время ЦПУ вместе с его разрешением.
Возвращаемое значение — пара (CPU-TICKS . TICKS-PER-SEC).
Счетчик CPU-TICKS может переполняться, поэтому значения не могут
быть осмысленно сравнены, если между ними прошло слишком много времени.