在Emacs Lisp中插入整个月份的日期

时间:2009-04-15 19:09:04

标签: emacs elisp

我在Emacs Lisp中进行了一些编程,但我不完全确定如何处理某些事情。

我正在尝试插入一整个月的日期,每个日期都在新行上,如下面的列表所示:

一月

01/01/09星期一:

02/01/09星期二:

03/01/09周三:

我该怎么做呢?我已经找到了如何格式化日期,但我找不到如何循环某个日期范围(在这种情况下循环整整一个月并打印一个月中每一天的日期)。

有没有人能指点我们如何开始?

3 个答案:

答案 0 :(得分:8)

您想要的功能是'encode-time'format-time-string'decode-time。 有关正确的文档,请C-h f function-name或将为您提供该函数的文档,或者可以在此处找到常规的elisp信息页面:C-h i m elisp RET m time conversion RET

以下是该片段:

(defun my-insert-dates ()
  "insert a bunch of dates"
  (interactive)
  (let* ((month 3)
         (day 1)
         (time (encode-time 1 1 0 day month 2009)))
    (while (= (nth 4 (decode-time time)) month)
      (insert (format-time-string "%D %a:\n" time))
      (setq day (1+ day))
      (setq time (encode-time 1 1 0 day month 2009)))))

我找不到如何确定给定月份的天数(当然,你可以硬编码,但是你必须处理闰年)。幸运的是,'encode-time为你做了所有的补充,所以如果你传递相当于“2月31日”,它将返回“3月3日”(假设28天)。

答案 1 :(得分:4)

如果您不介意使用日历功能,我会做这样的事情......

(require 'calendar)
(defun display-a-month (day month year)
  (insert (format "%s\n" (calendar-date-string (list  month day year))))
  (if (< day 30)
    (display-a-month (+ day 1) month year)))

您可以使用describe-function(M-x describe-function或C-h f,如前所述)找到帮助; M-x apropos将为您提供与某事物相关的功能列表,甚至更好的人在irc.freenode.org / #emacs上将回答您的所有问题。

顺便说一下,问题是“插入整整一个月”而不是“插入每个月的第一天”:)取决于你是否读取mm / dd / yyyy的dd / mm / yyyy

答案 2 :(得分:2)

使用dotimes对Trey的答案略有不同:

(defun my-insert-dates ()
  "insert the first day of each month"
  (interactive)
  (dotimes (mo 12)
    (insert (format-time-string "%D %a:\n" (encode-time 1 1 0 1 (1+ mo) 2009)))))