Время суток
В этом разделе объясняется, как определить текущее время и часовой пояс.
Многие функции, такие как 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. Эти функции описаны в следующих разделах.
- Функция: current-time-string &optional time zone
-
Эта функция возвращает текущее время и дату в виде удобочитаемой строки. Формат начальной части строки, содержащей в указанном порядке день недели, месяц, число месяца и время суток, не меняется: количество символов для этих полей всегда одинаково. Однако (если вам не нужны английские сокращения дней недели или месяцев независимо от локали) обычно удобнее использовать
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). Чтобы получить метку времени в определённой форме независимо от значенияcurrent-time-list, можно использовать(time-convert nil t)или(time-convert nil 'list). См. Преобразование времени.
- Функция: float-time &optional time
-
Эта функция возвращает текущее время в виде числа с плавающей точкой, выражающего количество секунд, прошедших с эпохи. Если задан необязательный аргумент time, он указывает время для преобразования вместо текущего.
Предупреждение: поскольку результат представлен числом с плавающей точкой, он может быть неточным. Не используйте эту функцию, если требуются точные метки времени. Например, в типичных системах
(float-time '(1 . 10))отображается как «0.1», хотя это число немного больше 1/10.time-to-seconds— псевдоним этой функции.
- Функция: current-cpu-time
Возвращает текущее время CPU вместе с его разрешением. Возвращаемое значение — пара
(CPU-TICKS . TICKS-PER-SEC). Счётчик CPU-TICKS может переполняться, поэтому значения нельзя осмысленно сравнивать, если между ними прошло слишком много времени.
Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Time-of-Day.html