西暦 to 和暦
Posted feedbacks - Scheme
できるだけ素直に、作ってみました。
> (toWareki "1868/12/2")
("明治1年12月2日")
> (toWareki "1926/12/24")
("大正15年12月24日")
> (toWareki "2007/12/01")
("平成19年12月1日")
> (toWareki "1926/12/25")
("大正15年12月25日" "昭和1年12月25日")
> (toWareki "1868/1/2")
"範囲外"
> (toWareki "1868/100/2")
"範囲外"
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | (define (leap? y)
(cond
((= (modulo y 400) 0) #t)
((= (modulo y 100) 0) #f)
((= (modulo y 4) 0) #t)
(#t #f)))
(define (readDate s) (map string->number (string-split s "/")))
(define (getYear d) (car d))
(define (getMonth d) (cadr d))
(define (getDay d) (caddr d))
(define (comp func d1 d2)
(cond
((= (func d1) (func d2)) 0)
((< (func d1) (func d2)) -1)
((> (func d1) (func d2)) 1)))
(define (compYear d1 d2) (comp getYear d1 d2))
(define (compMonth d1 d2) (comp getMonth d1 d2))
(define (compDay d1 d2) (comp getDay d1 d2))
(define (compDate d1 d2)
(if (= (compYear d1 d2) 0)
(if (= (compMonth d1 d2) 0)
(if (= (compDay d1 d2) 0)
0
(compDay d1 d2))
(compMonth d1 d2))
(compYear d1 d2)))
(define (calcYear base d) (- (getYear d) (- (getYear (cadr base)) 1)))
(define (okDate? date)
(define y (getYear date))
(define m (getMonth date))
(define d (getDay date))
(cond
((< m 1) #f)
((< 12 m) #f)
((< d 1) #f)
((< 31 d) #f)
((and (= d 4) (< 30 d)) #f)
((and (= d 6) (< 30 d)) #f)
((and (= d 9) (< 30 d)) #f)
((and (= d 11) (< 30 d)) #f)
((and (leap? y) (= d 2) (< 29 d)) #f)
((and (= d 2) (< 28 d)) #f)
(#t #t)))
(define (makeWareki bases ds)
(map makeWarekiStr
(map list (map car bases)
(map cons (map calcYear bases ds) (map cdr ds)))))
(define (makeWarekiStr wareki)
(string-append (car wareki)
(makeDateStr (map number->string (cadr wareki)))))
(define (makeDateStr dateStrs)
(string-append
(getYear dateStrs) "年"
(getMonth dateStrs) "月"
(getDay dateStrs) "日"))
(define meiji (list "明治" (readDate "1868/9/8")))
(define taisho (list "大正" (readDate "1912/7/30")))
(define showa (list "昭和" (readDate "1926/12/25")))
(define heisei (list "平成" (readDate "1989/1/8")))
(define (toWareki ds)
(define d (readDate ds))
(cond
((not (okDate? d)) "範囲外")
((= (compDate d (cadr meiji)) -1) "範囲外")
((= (compDate d (cadr taisho)) -1) (makeWareki (list meiji) (list d)))
((= (compDate d (cadr taisho)) 0) (makeWareki (list meiji taisho) (list d d)))
((= (compDate d (cadr showa)) -1) (makeWareki (list taisho) (list d)))
((= (compDate d (cadr showa)) 0) (makeWareki (list taisho showa) (list d d)))
((= (compDate d (cadr heisei)) -1) (makeWareki (list showa) (list d)))
((= (compDate d (cadr heisei)) 0) (makeWareki (list showa heisei) (list d d)))
((= (compDate d (cadr heisei)) 1) (makeWareki (list heisei) (list d)))))
|


ocean
#5067()
Rating0/8=0.00
>a.py 1868/12/2
明治1年12月2日
>a.py 1926/12/24
大正15年12月24日
>a.py 2007/12/01
平成19年12月1日
>a.py 1926/12/25
大正15年12月25日 昭和1年12月25日
>a.py 1868/1/2
範囲外
>a.py 1868/100/2
範囲外
see: 和暦西暦対応表
[ reply ]