我正在编辑orgmode,这是emacs的时间管理模式。我正在添加一些新的时间功能。 在我的补充中,我需要确定给定日期的星期几。我使用以下代码:
(defun org-day-of-week (day month year)
(nth-value 6 (decode-universal-time (encode-universal-time 0 0 0 day month year 0) 0)))
执行此代码会给我错误:
nth-value:符号的函数定义为void:decode-universal-time
我是lisp的新手,无法找到与此错误相关的任何信息。我假设某些库未加载或可用。 有人可以对此有所了解吗?
此致 Erwin Vrolijk Snow.nl
答案 0 :(得分:3)
基本上decode-universal-time
是Common Lisp函数。这些不一定在emacs-lisp中可用。一些快速检查本地emacs表明这是事实。
接近原始实现的内容将是:
(defun org-day-of-week (year month day)
(nth 6
(decode-time
(date-to-time
(format "%d-%02d-%02dT00:00:00" year month day)))))
您应该可以使用decode-time
代替(可能与date-to-time
结合使用):
decode-time是`C源代码'中的内置函数。 (解码时间和可选的指定时间) 将时间值解码为(SEC MINUTE HOUR DAY DTH DEAR DOW DST ZONE)。 可选的指定时间应该是(HIGH LOW.IGNORED)的列表, 从`current-time'和`file-attributes',或者nil来使用 当前时间。过时的形式(HIGH.LOW)也仍然被接受。 该列表包含以下九个成员:SEC是0之间的整数 和60;美国证券交易委员会是60闰秒,只有一些操作系统 支持。 MINUTE是0到59之间的整数.HOUR是整数 在0到23之间.DAY是1到31之间的整数.MONTH是一个 YEAR是1到12之间的整数.YEAR是一个整数,表示 四位数年份。 DOW是星期几,0到6之间的整数, 其中0是星期日。如果夏令时有效,则DST为t, 否则没有。 ZONE是一个表示秒数的整数 格林威治以东。 (请注意,Common Lisp具有不同的含义 DOW和ZONE。)
答案 1 :(得分:2)
Vatine answer的清洁版本是:
(defun day-of-week (year month day)
"Return the day of the week given a YEAR MONTH DAY"
(nth 6 (decode-time (encode-time 0 0 0 day month year))))
decode-time
和encode-time
为documented here。
答案 2 :(得分:0)
我还没有找到此问题的根源,但找到了解决方法:
(defun day-of-week (day month year)
"Returns the day of the week as an integer.
Sunday is 0. Works for years after 1752."
(let ((offset '(0 3 2 5 0 3 5 1 4 6 2 4)))
(when (< month 3)
(decf year 1))
(mod
(truncate (+ year
(/ year 4)
(/ (- year)
100)
(/ year 400)
(nth (1- month) offset)
day
-1))
7)))