開発したアプリなど一覧

ruby で西暦和暦泰仏歴を変換するページを作成した

来年には平成が終わり新しい元号になるとの事なので西暦から和暦へ変換するコードを書いてみた。ついでに良く行く国だけどいまいちよくわかっていないタイの仏歴についても書いた。

以下の Web ページで動作を確認できる。

西暦和暦変換表 | tools.loumo.jp

ruby で西暦から和暦へ変換する

西暦から和暦へ変換するコードというのをググると以下のような if 文を羅列したコードが出てくる事が多い。

# 動作確認はしていないがこんな感じ
def convertCommonEraToJpEra(year)
    if 1989 < year and year < 2019
        return '平成%d年' % (year - 1988)
    elsif year == 1989
        return '平成元年'
    elsif 1926 < year and year < 1989
        return '昭和%d年' % (year - 1988)
    # 以下略
    end
end

もちろんコレでも動くが元号が変わる都度 if 文を追加していくのはあんまり良い感じがしない。

自分は以下のように書いた。

def jpYearList
    [
        {:name=>'新歴(仮)', :start=>2019},
        {:name=>'平成', :start=>1989},
        {:name=>'昭和', :start=>1926},
        {:name=>'大正', :start=>1912},
        {:name=>'明治', :start=>1868},
        {:name=>'慶応', :start=>1865},
    ]
end

def convertToJpYear(n)
    jpYearList.each_with_index do |y, k|
        njy = k > 0 ? jpYearList[k-1] : {:start => 9999}
        if y[:start] < n and n < njy[:start]
            return '%s %d 年' % [y[:name], (n - y[:start] + 1)]
        end
        if y[:start] == n
            ljy = jpYearList[k+1]
            ret = '%s 元年' % y[:name]
            if !ljy.nil?
                ret = ret + '<br>%s %d 年' % [ljy[:name], n - ljy[:start] + 1]
            end
            return ret.html_safe
        end
    end
    return n
end

こうすれば元号が追加されても jpYearList に一行追加するだけで良い。そのかわり毎回ループが入るので遅いかもしれないが、大した差じゃないだろうし実際に HTML として表示する際にはキャッシュが効くので遅さが問題になる事は無いと思う。

each 以外にも select とか使って検索する方法もあるが key が必要なので each で回すのが手っ取り早いかもしれない。ruby に自信ニキならもっと良い方法を思いつくと思う。

とは言えこういうのは自分で書くより既存のライブラリを使ったほうが良いと思う。ruby なら wareki gem というものがある。

GitHub - sugi/wareki: ruby 向け和暦ライブラリ。和暦と標準Dateの双方向変換をサポート。全元号対応。

ruby で西暦からタイ仏暦へ変換する

タイ王国では仏滅紀元を採用している。東南アジアでは仏滅紀元を採用している国は他にもあるが国によって微妙に差異があり、タイ、カンボジア、ラオスでは紀元前543年を仏滅紀元元年とし、ミャンマー及びスリランカではその一年前である紀元前544年を元年とする。

なのでタイ仏歴を取得したければ西暦に 543 を追加するだけで良い。

def convertToThaiYear(year)
	'%d 年' % (year + 543)
end

ちなみにタイでは西暦1912年に仏滅紀元を導入するまでは、チャクリー王朝が創設された西暦1782年を元年とするラッタナコーシン歴を利用していた。まぁもう使わんから必要無いだろう。

Sponsored Link

コメント