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を読んでみると楽しいかもしれません。