Ruby に令和がやってきた 🎉


Ruby 2.6.3 リリース

2019/04/17 (水) に Ruby 2.6.3 がリリースされました。

主な変更点は

このリリースでは日本の新元号「令和」のサポートを追加しています。 具体的には Unicode のバージョンを 12.1 beta に更新する (#15195) とともに、date ライブラリを更新しています (#15742)。

とのことです。

ついに Ruby に令和がやってきましたね!

確認

Unicode について

「令和」の合字1 である U+32FF が Unicode 12.1 で予約されています。そして Ruby 2.6.3 ではそのベータ版である Unicode 12.1 beta をサポートしています。

Ruby 2.6.2

"\u32FF"
#=> "\u32FF"

Ruby 2.6.3

# 2019/04/18 (木) 時点では、ほとんどのフォントがまだ U+32FF (令和の合字) に対応していないので
# ほとんどの環境で豆腐になってしまう。
"\u32FF"
#=> "㋿"

# NFKD で Unicode 正規化すると……
"\u32FF".unicode_normalize(:nfkd)
#=> "令和"

令和きたー

Date について

Date#jisx0301 メソッドで和暦 (JIS X 0301 形式) を取得できるのですが、これが令和に対応しました。

Ruby 2.6.2

require 'date'

Date.new(2019, 4, 30).jisx0301
#=> "H31.04.30"

Date.new(2019, 5, 1).jisx0301
#=> "H31.05.01"

Ruby 2.6.3

require 'date'

Date.new(2019, 4, 30).jisx0301
#=> "H31.04.30"

Date.new(2019, 5, 1).jisx0301
#=> "R01.05.01"

R01 きたー

おまけ

Date オブジェクトを和暦の文字列に変換するメソッドを実装してみました。

def wareki(date)
  era_initials = %w[M T S H R]
  era_names = %w[明治 大正 昭和 平成 令和]
  wday_names = %w[日 月 火 水 木 金 土]
  jisx0301_pattern = /\A([A-Z]?)(\d+)[\.-](\d+)[\.-](\d+)\z/

  era_initial, year, month, day = date.jisx0301.match(jisx0301_pattern).captures
  era_name = era_initials.zip(era_names).to_h[era_initial]
  wday_name = wday_names[date.wday]

  format('%s%d年%d月%d日(%s)', era_name, year, month, day, wday_name)
end

require 'date'

wareki(Date.new(1872, 12, 31))
#=> "1872年12月31日(火)"
wareki(Date.new(1873, 1, 1))
#=> "明治6年1月1日(水)"
wareki(Date.new(2019, 4, 30))
#=> "平成31年4月30日(火)"
wareki(Date.new(2019, 5, 1))
#=> "令和1年5月1日(水)"

  1. (U+337C) や (U+337B) のように複数の文字を合成して一文字にした文字のこと。