代码之家  ›  专栏  ›  技术社区  ›  robintw

在Emacs Lisp中插入整月日期

  •  7
  • robintw  · 技术社区  · 15 年前

    我正在EmacsLisp中做一些编程工作,但我不完全确定如何处理某些事情。

    我试图插入一整月的日期,每一个日期都在一行上,如下所示:

    一月

    01/01/09

    02/01/09星期五:

    03/01/09周:

    我该怎么做呢?我已经找到了如何格式化日期的方法,但是我找不到如何循环处理特定范围的日期(在本例中,循环处理整个月,并为该月的每一天打印一个日期)。

    有没有人能给我一些建议,告诉我如何开始?

    3 回复  |  直到 13 年前
        1
  •  8
  •   Trey Jackson    15 年前

    你想要的功能是 '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)))))
    

    我找不到如何确定一个月的天数(当然,你可以硬编码,但是你必须处理闰年)。幸运的是, 编码时间 为你做所有的添加,所以如果你通过相当于“2月31日”,它将返回“3月3日”(假设28天)。

        2
  •  4
  •   Ben    15 年前

    如果你不介意使用日历功能的话,我会这样做的…

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

    您可以使用描述函数(如前所述,M-X描述函数或C-H F)找到帮助;M-X APROPOS将为您提供一个与某个事物相关的函数列表,并且在irc.freenode.org/__emacs将回答您所有的问题。

    另外,问题是“插入整个月”而不是“插入每个月的第一天”:)取决于您是否阅读了mm/dd/yyyy的dd/mm/yyyy

        3
  •  2
  •   scottfrazer    15 年前

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