Edited at

Rubyで和暦・旧暦を扱うライブラリ (パースもできるよ!)

More than 1 year has passed since last update.


Yet another ruby 和暦ライブラリ

Pure ruby な日本の和暦を扱うライブラリ、名前はまんま "wareki" を作りました。割と網羅的な物になったと思うので、ぜひ使ってみて下さい。

コードと README は github に置いてあります


特徴


  • 和暦と西暦を相互変換

  • 日本語の日付文字列をパースして Date に

  • 元号は大化から全部サポート

  • 旧暦は445年からサポート

  • 特殊記法(旧字体、略字、月の別名、晦日や朔日など)対応


コードサンプル


簡単な例

require 'wareki' すると、標準ライブラリの Date クラスの parse と strftime を上書きします。(もしこの挙動が嫌な場合は wareki/date を直接 require してください。)

d = Date.parse("平成二七年 08月 22日")

d.strftime("%F") # => "2015-08-22"
d.strftime("%JF") # => "平成二十七年八月二十二日"
d.strftime("%Jf") # => "平成27年8月22日"

普通にパースして、strftime で出力できます。フォーマット文字列は色々ありますので、ドキュメントを参照してください

まあ、半角数字で出る%Jf (例: 平成27年8月22日) と、全部漢数字の %JF (例: 平成二十七年八月二十二日) があれば大体困らないと思います。


パース

旧暦を含むの日本語の日付文字列パースして、組み込み Date オブジェクトに変換できます。この時、慣例的に使われていたい色々な表記も解釈できます。(標準では Date::ITALY な Date オブジェクトに変換しますが、第3引数の start に改暦日を渡せます。)

Date.parse("㍻一〇年 肆月 晦日")    # => #<Date: 1998-04-30 ...

Date.parse("安政七年 弥生") # => #<Date: 1860-03-22 ...
Date.parse("元仁元年閏七月朔日") # => #<Date: 1224-08-17 ...
Date.parse("萬延三年 5月 廿一日") # => #<Date: 1862-06-18 ...
Date.parse("皇紀二千皕卌年") # => #<Date: 1580-01-17 ...


和暦・旧暦へのフォーマット

日本では明治5年まで、グレゴリオ暦でもユリウス歴でもない旧暦が使われていました。これもフォーマット文字列経由で透過的に扱えます。

旧暦の場合の月日 (%Jm, %Jd) と、グレゴリオ暦やユリウス暦での月日 (%m, %d)は違うものを出力します。

こんな感じ。

d = Date.civil(1860, 4, 7)

dj = d.new_start(Date::JULIAN)
d.strftime # => "1860-04-07" (グレゴリオ暦)
dj.strftime # => "1860-03-26" (ユリウス暦)
d.strftime("%Jf") # => "安政7年3月17日" (日本の旧暦)
d.strftime("皇紀%Ji年%Jm月%Jd日") # => "皇紀2520年3月17日" (日本の旧暦で神武天皇即位紀元年)


もっと

基本的には直接扱う必要はありませんが、Date::Wareki を直接扱うともうちょっと細かいこともできます。ただし、ここのドキュメントはまだ未整備です。

wd = Wareki::Date.new("天和", 3, 5, 4, true)

wd.leap_month? # => true (閏月かどうか)
wd.era_name # => "天和"
wd.era_year # => 3 (その元号での年)
wd.year # => 1683 (旧暦の年)
wd.jd # => 2335942 (ユリウス日(JDN))
wd.to_date # => #<Date: 1683-06-28...


リファレンス

最初は「ユリウス歴って何?」という状態だったので、調べながら作っていて凄く面白かったです。興味がある人は以下のURLを読んでみると楽しいかもしれません。