;;; yrnen.el - Convert years between A.D. and Japanese era (Meiji-Heisei)
;;; Created 2008-9-29 by David Meyer.

(setq era-list  ; - eras in reverse chron. order
               ; - epoch is day after prev. emperor's death
     '((name "Heisei"  epoch-yr 1989  epoch-mo 10  epoch-day 8)
       (name "Showa"   epoch-yr 1926  epoch-mo 12  epoch-day 25)
       (name "Taisho"  epoch-yr 1912  epoch-mo 7   epoch-day 30)
       (name "Meiji"   epoch-yr 1868  epoch-mo 9   epoch-day 9)))

(setq month-name
     '("January" "February" "March" "April" "May" "June" "July" "August" "September" "October" "November" "December"))

(defun month-long (month) "Return full name of month (1-12)."
 (nth (1- month) month-name))

(defun month-short (month) "Return month (1-12) abbreviation."
 (substring (month-long month) 0 3)

(defun initial (string) "Return first character of string."
 (substring string 0 1))

;(defun get-era-prop (era-i property) "Return prop. ('name, 'epoch-yr, 'epoch-mo, 'epoch-day) of era at index."
 (plist-get (nth era-i era-list) property))
b
(defun ad->wareki (year) "Convert A.D. year to Japanese (era year)."
 (let ((era-yr-start nil) (era-yr-end nil) (prev-eras era-list))
   (while (and prev-eras (not era-yr-start))
     (let* ((e (car prev-eras)) (epoch-yr (plist-get e 'epoch-yr)))
       (setq prev-eras (cdr prev-eras))
       (cond
        ((> year epoch-yr) (setq era-yr-start e))
        ((= year epoch-yr) (setq era-yr-end e)))))



 (let ((nen nil) (i 0))
   (while (and (not nen) (< i (length era-list)))
     (let ((epoch-yr (get-era-prop i 'epoch-yr)))
       (cond ((> year epoch-yr)
               (setq nen (list i (1+ (- year epoch-yr)))))
              ((= year epoch-yr)
               (setq nen
                     (if (= i (1- (length era-list)))
                         (list i 1)
                       (list (1+ i)
                             (- epoch-yr
                                (get-era-prop (1+ i) 'epoch-yr))
                             i
                             1))))))
     (setq i (1+ i)))
 (if (not nen) '(-1) nen)))