Глядя на документацию:
(decode-time &optional TIME ZONE)
Декодируйте значение времени как (SEC MINUTE HOUR DAY MONTH YEAR DOW DST UTCOFF). Необязательное TIME должно быть списком (HIGH LOW. IGNORED), начиная с 'current-time' и 'file-attribute' или nil, чтобы использовать текущее время.Это также может быть одно целое число секунд с начала эпохи.Устаревшая форма (HIGH. LOW) также все еще принимается.
Таким образом, мы можем видеть, что ожидаемый формат представляет собой список со значениями "HIGH" и "LOW" (и, возможно, некоторой дополнительной информацией),Следуя этому направлению к current-time
, мы даем дополнительное объяснение:
(current-time)
Возвращает текущее время в виде количества секунд с 1970-01-01 00:00:00.Время возвращается в виде списка целых чисел (HEC LOW USEC PSEC).HIGH имеет младшие значащие биты, а LOW - младшие 16 бит.USEC и PSEC - это микросекунды и пикосекунды.
Почему Emacs использует этот, казалось бы, сложный формат?Несомненно, ответ прост: Emacs устарел, и ему нужно было работать с системами, в которых были доступны только 16-битные целые числа.
Глядя в руководство, Mx elisp-index-search
для current-time
приводит нас к (elisp)Time of Day
:
Большинство этих функций представляют время в виде списка из четырех целых чисел (SEC-HIGH SEC-LOW MICROSEC PICOSEC) '.Это количество секунд от «эпохи» (1 января 1970 года в 00:00 UTC) по формуле: HIGH * 2 ** 16 + LOW + MICRO * 10 ** - 6 + PICO * 10 ** -12.Возвращаемое значение 'current-time' представляет время, используя эту форму, также как и отметки времени в возвращаемых значениях других функций, таких как 'file-attribute' (* note Примечание Определение file-attribute: :).В некоторых случаях функции могут возвращать двух- или трехэлементные списки, при этом пропущенные компоненты MICROSEC и PICOSEC по умолчанию имеют значение 0примите более общий формат «значение времени», который может быть списком целых чисел, как указано выше, или одним числом в секундах с начала эпохи, или «ноль» для текущего времени.Вы можете преобразовать значение времени в удобочитаемую строку, используя 'current-time-string' и 'format-time-string', в список целых чисел, используя 'seconds-to-time', и в другие формы, используя 'decode-time 'и' float-time '. Эти функции описаны в следующих разделах.
Следовательно, вы можете, например, передать единственное 32-битное целое число метки времени Unix в decode-time
(decode-time 1554670400)
=> (20 53 8 8 4 2019 1 nil 43200)
Вы также можете использовать format-time-string
, чтобы получить одно целое значение:
(string-to-number (format-time-string "%s" (current-time)))