来年には平成が終わり新しい元号になるとの事なので西暦から和暦へ変換するコードを書いてみた。ついでに良く行く国だけどいまいちよくわかっていないタイの仏歴についても書いた。
以下の Web ページで動作を確認できる。
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年を元年とするラッタナコーシン歴を利用していた。まぁもう使わんから必要無いだろう。
コメント