函数encode-time 有帮助:
(let ((l (parse-time-string "2014-09-12")))
(format-time-string "%d %m %Y" (encode-time 0 0 0 (nth 3 l) (nth 4 l) (nth 5 l))))
以下版本使用cl-flet,以避免在需要多次编码时代码加倍。如果您在其他函数中也需要编码,可以使用defun 而不是cl-flet。
(eval-when (compile) (require 'cl)) ;; for cl-flet
(let ((A2 "2014-10-08") ;; just for testing
(A1 "2014-10-03")) ;; just for testing
(cl-flet ((encode (str)
(let ((l (parse-time-string str)))
(encode-time 0 0 0 (nth 3 l) (nth 4 l) (nth 5 l)))))
(let* ((t-prev (encode A1))
(t-this (encode A2)))
(/ (time-to-seconds (time-subtract t-this t-prev)) (* 24 60 60)))))
作为一个函数:
(eval-when (compile) (require 'cl)) ;; for cl-flet
(defun day-diff (date1 date2)
"Calculate the difference of dates in days between DATE1-STR and DATE2-STR."
(interactive "sDate1:\nsDate2:")
(cl-flet ((encode (str)
(let ((l (parse-time-string str)))
(encode-time 0 0 0 (nth 3 l) (nth 4 l) (nth 5 l)))))
(setq date1 (encode date1)
date2 (encode date2))
(let ((ret (/ (time-to-seconds (time-subtract date1 date2)) (* 24 60 60))))
(when (called-interactively-p 'any)
(message "Day difference: %s" ret))
ret)))
(put 'day-diff 'safe-function t)
使用calc 的替代方法是:
(require 'calc)
(defun day-diff (date1 date2)
"Calculate the difference of dates in days between DATE1-STR and DATE2-STR."
(interactive "sDate1:\nsDate2:")
(let ((ret (string-to-number (calc-eval (format "<%s>-<%s>" date1 date2)))))
(when (called-interactively-p 'any)
(message "Day difference: %s" ret))
ret))
如果你省略了一些不错的功能,这几乎变成了一个简单的单元格公式:(string-to-number (calc-eval (format "<%s>-<%s>" A1 A2)))。
如果您想将这些内容保存在电子表格中,您可以将 defun 放在表格单元格 A1 中。一个更简单的例子:
(progn (defun day-diff (date1 date2) (string-to-number (calc-eval (format "<%s>-<%s>" date1 date2)))) (put 'day 'safe-function t) "Actual header")
为了获得更方便的编辑可能性,您可以切换到 M-x lisp-mode。
在那里你找到
^L
(ses-cell A1 "Actual Header" (progn (defun day-diff (date1 date2) (string-to-number (calc-eval (format "<%s>-<%s>" date1 date2)))) (put 'day 'safe-function t) "Actual header") nil nil)
您可以编辑。但不要插入换行符! ses 用该文件中的行号标识单元格位置!
另一个不错的选择是将函数的定义放入文件局部变量列表中。
通过 M-x lisp-interaction-mode 切换到 lisp 交互模式。
转到文件的末尾。在那里你可以找到这些行:
;; Local Variables:
;; mode: ses
;; End:
将您的函数定义作为eval 添加到此列表中:
;; Local Variables:
;; mode: ses
;; eval:
;; (progn
;; (defun day-diff (date1 date2)
;; (string-to-number (calc-eval (format "<%s>-<%s>" date1 date2))))
;; (put 'day-diff 'safe-function t))
;; End:
您可以添加不带注释字符; 的progn。在这种情况下,甚至缩进也有效。之后您可以致电comment-region 获取progn。
您可以保存文件并运行 M-x normal-mode。之后定义函数,您可以在电子表格中使用它。