簡単な遊びのプログラムが作りたかったのでやってみました。Date クラスは使っていません。
こんな感じです。コマンドライン引数を指定します。
#西暦から和暦 $ ruby gengou.rb 2018 平成30年 $ ruby gengou.rb 1945 昭和20年 $ ruby gengou.rb 1912 明治45年 大正元年 #和暦から西暦 $ ruby gengou.rb m1 西暦1868年 $ ruby gengou.rb h30 西暦2018年
明治はm、大正はt、昭和はs、平成はh で指定します。
コード。
gengou.rb
years_table = [[1868, 1912], [1912, 1926], [1926, 1989], [1989, 2019]] period_names = %W(明治 大正 昭和 平成) period_initials = %W(m t s h) #西暦から和暦へ year_to_period = ->(year) { year1 = 0 years_table.each_with_index do |y, i| if y[0] <= year and year <= y[1] year1 = year - y[0] + 1 year1 = "元" if year1 == 1 puts period_names[i] + "#{year1}年" end end puts "その西暦はサポートしていません" if year1 == 0 } #和暦から西暦へ period_to_year = ->(period, year) { period.downcase! period_initials.each_with_index do |p_ini, i| if period == p_ini year1 = years_table[i][0] + year - 1 st = if year1 > years_table[i][1] "#{period_names[i]}に#{year}年はありません" else "西暦#{year1}年" end puts st end end } if (m = /^(\d+)$/.match(ARGV[0])) year_to_period.(m[1].to_i) elsif (m = /^([a-zA-Z])(\d+)$/.match(ARGV[0])) period_to_year.(m[1], m[2].to_i) else puts "許されない入力です" end
データを増やせばすべての元号に対応させることも可能です。ただ、頭文字の重複があるでしょうから、漢字で指定するようにしないといけませんね。
遊びですけれど、こういうのを書くには Ruby 最強じゃないですか? 書いていてチョー気持ちいいです。
かんたんな遊びのプログラミングいいですね。もっと題材を探したいです。
こんなのもどうぞ。
obelisk.hatenablog.com