a
decode-time
, но согласно паттернам, которые воспринимает функция format-time-string
. И вот я пробую изобразить сегодняшнюю дату:ELISP> (format-time-string "%Y-%m-%d %H:%M:%S"
(- (decoded-time-period (decode-time))
(decoded-time-period
;; '(0 0 0 0 0 1970 nil -1 0)
'(0 0 0 17 0 1970 nil -1 0)
)))
"2021-02-06 11:40:53"
И я бы понял если б там было
(0 0 0 0 0 1970 nil -1 0)
, но там (0 0 0 17 0 1970 nil -1 0)
. А в другие даты там разница в другое количество дней, но именно в целое количество дней. В чем дело и как изображать такие даты?decoded-time-period
считает, что во всех месяцах 30 дней, и накапливаются дниИтого, если не учитывать локальные особенности давних эпох или достаточно далекого будущего,
(defconst the-first-leap-year-before-1970 (- 1970 (mod 1970 4)))
(defun format-decoded-time-string (format-string decoded-time)
(let* ((year (decoded-time-year decoded-time))
(decoded-time-period-offset
(- 25 (floor (- year the-first-leap-year-before-1970) 4))))
(format-time-string
format-string
(- (decoded-time-period decoded-time)
(decoded-time-period
`( 0 0 0 ,(let ((month (decoded-time-month decoded-time)))
(+ decoded-time-period-offset
(ecase month
(1 (if (zerop (mod year 4)) 7 6))
(2 (if (zerop (mod year 4)) 6 5))
(3 7)
(4 6)
(5 6)
(6 5)
(7 5)
(8 4)
(9 3)
(10 3)
(11 2)
(12 2))))
0 1970 nil -1 0))))))