Lisp:decode-universal-time无效

时间:2010-11-17 09:45:16

标签: emacs lisp elisp

我正在编辑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

3 个答案:

答案 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-timeencode-timedocumented 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)))