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

7
我在Emacs Lisp中进行一些编程,但我不太确定如何处理某些事情。
我正在尝试插入整个月份的日期,每个日期都在新行上,就像下面的列表一样:
January
01/01/09 Mon:
02/01/09 Tue:
03/01/09 Wed:
等等
我该怎么做呢?我已经找到了如何格式化日期,但我找不到如何循环一定范围内的日期(在这种情况下循环整个月份并为该月的每一天打印一个日期)。
有没有人能给我一些指针,告诉我如何开始?
3个回答

8
你需要的函数是'encode-time, 'format-time-string'decode-time。 要获取正确的文档,请键入C-h f 函数名或者C-h i m elisp RET m time conversion RET来查看一般的elisp信息页面,这些函数的文档也会在其中给出。
(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天)。


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 上的人们将回答您所有问题。
顺便说一下,问题是“插入整个月”,而不是“插入每个月的第一天” :) 这取决于您是否阅读 dd/mm/yyyy 还是 mm/dd/yyyy。

出于好奇,为什么要使用(let (_) ...包装器? - Trey Jackson
只是因为我忘记了elisp能够执行非功能性工作,所以正在更新... - Ben

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)))))

只是评论一下,我更新了我的答案以便循环遍历天数(而不是月份)。以防万一有人对如何从我的答案中推导出你的答案感到困惑。 - Trey Jackson
哎呀,现在我的回答没有意义了 :) 哦,不过,对于计数循环来说,dotimes 仍然是值得了解的。 - scottfrazer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接