Help us understand the problem. What is going on with this article?

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

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away