如何将月份名称解码为整数

时间:2013-12-10 20:36:04

标签: emacs elisp

我正在尝试编写一个函数,让我选择(交互式)org-agenda-month-view的月份和年份 - 使用201312格式(不带双引号),2013年12月。我想在本月使用单词(December)或数字(12),但需要一些帮助(请)将月份名称解码为整数 - 类似{{ 1}}。

此外,关于如何将我的两个(if (not (integer-p month)) (setq month (decode-name-of-month month))) read-string绑定合并为一个操作的任何指针都将非常感激 - 即,能够手动输入let或{{1 }};而不是先输入January 2014,然后在两个单独的操作中输入01 2014

January

编辑(2013年12月11日):基于@Drew和@Sean Perry的有用答案的第一份工作草案。添加了变量2014,允许(let* ( (year (read-string "Insert the year: ")) (month (read-string "Insert the month: "))) (org-agenda nil "1") (org-agenda-month-view (read (format "%s%02s" year month)))) 根据用户输入在[开头]显示正确的月份 - 不再需要函数org-agenda-start-day。更新了变量(org-agenda nil "1")以修正拼写错误并包含其他可能性 - 例如01,02等

org-agenda-month-view

2 个答案:

答案 0 :(得分:1)

(defun foo (month year)
  (interactive
   (let* ((mon+yr  (split-string
                    (read-string "Month and year: " nil nil
                                 (format-time-string "%B %Y"(current-time)))
                    nil 'TRIM))
          (mon     (car mon+yr))
          (yr      (cadr mon+yr))
          (m2      (condition-case nil (format "%d" mon) (error nil))))
     (list (or m2 mon)  yr)))
  (message "Month: %s, Year: %s" month year))

M-x foo 12 2013         ==> Month: 12, Year: 2013
M-x foo December 2013   ==> Month: December, Year: 2013
M-x foo Dec 2013        ==> Month: Dec, Year: 2013
M-x foo Nebraska 200000 ==> Month: Nebraska, Year: 200000

但是你明白了。 (检查有效的月份名称和月份和年份数字。)

答案 1 :(得分:1)

(require 'parse-time) ;; in standard lib
(defun encode-name-of-month (month_name)
  (cdr (assoc (downcase month_name) parse-time-months))
 )
(defun decode-name-of-month (month)
  (car (rassoc month parse-time-months))
 )

这应该让你开始。