41
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-08-25

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

41
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
41
35

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?