西暦から和暦に変換させる方法(年だけの部分を抽出したい)
オリジナルアプリを作成している過程で、年表示のとこだけを抽出して「西暦を和暦へ」変換させたいと思ったのですが、私は、以下のような方法で、年号変換を実装してみたので、記事にしてみました。
require 'date'
NENGO_EIJI_KANJI = {'M'=>'明治','T'=>'大正','S'=>'昭和','H'=>'平成', 'R'=>'令和'}
# 1988年1月21日の西暦を和暦に変換させる
input = Date.new(1988, 1, 21).jisx0301
input = input.split(".")
nengo = input[0].split(//)
nengo[0] = NENGO_EIJI_KANJI[nengo[0]]
nengo = nengo.join
p "西暦を和暦に変換すると#{nengo}年です"
# 西暦を和暦にすると昭和63年です
以下、コードを解説していきます。
Dateクラスについて
Rubyの標準ライブラリで、日付や曜日を扱う際に使用するものです。
Dateクラスを使用すると、年号変換を英字表示で変換することができます。
ただ、日本語表示には対応していないようなので、英字表示されたものを日本語に変換できるように定数でハッシュを作成してやり、
NENGO_EIJI_KANJI = {'M'=>'明治','T'=>'大正','S'=>'昭和','H'=>'平成', 'R'=>'令和'}
といった感じで格納してあげ、該当する英字を日本語に変換できるようにしてあげます。
jisx0301メソッドとsplitメソッド
Dateクラスのjisx0301メソッド
で和暦 (JIS X 0301 形式) を取得できます。
例えば、
####Ruby 2.6.5
require 'date'
Date.new(2021, 4, 24).jisx0301
# "R03.04.24"
といった感じに、西暦を和暦の英字表示に変換してくれます。
splitメソッドは、文字列を配列に格納してくれるメソッドです。
ある特定な文字列を分割したいところで様々な方法で分割してくれます。
例えば、先のコードで説明すると、
input = Date.new(1988, 1, 21).jisx0301 # "S63.01.21"
nengo = input.split(".") # nengo = ["S63", "01", "21"]
となり、引数で指定した文字の部分で区切って配列を返してくれます。
これで、nengo[0]
でS63
を抜き出すことができるようになります。
また、最終的にほしいのは「S」の部分であり、これを定数で定義した日本語表示の年号に変換させることで当初の目的を達成するのですが、splitメソッド
の引数に「//」を使うと、1文字づつ配列に格納して返してくれます。
これを使うと、
nengo = nengo[0].split(//) # nengo = ["S", "6", "3"]
となり、nengo[0]
で「S」のみ抽出することができるようになります。
これをNENGO_EIJI_KANJI[nengo[0]]
と記載して、西暦を和暦に変換することができます。
joinメソッド
このままの状態だと
p nengo # ["昭和", "6", "3"]
となってしまい、配列表示になってしまうので、この配列を1つの文字列にくっつけてやりたいのですが、このときに使うのがjoinメソッド
になります。
joinメソッド
を使うと、配列の各要素を結合して1つの文字列にしてれるので、
nengo = nengo.join # "昭和63"
p "西暦を和暦にすると#{nego}年です"
# 西暦を和暦にすると昭和63年です
と「年」の部分だけを抽出して西暦を和暦に変換することができるようになります。
他にも、こんな方法があるよ!とか、ご指摘等ありましたら、教えていただけると幸いです。
ご覧いただきありがとうございました。