Module: EraJa::Conversion

Included in:
Date, Time
Defined in:
lib/era_ja/conversion.rb

Constant Summary collapse

ERA_NAME_DEFAULTS =
{
  meiji:  ["M", "明治"],
  taisho: ["T", "大正"],
  showa:  ["S", "昭和"],
  heisei: ["H", "平成"],
  reiwa:  ["R", "令和"]
}.freeze
FORMAT_STRING_MAP =
{
  '%J' => '%J%',
  '%K' => '%K%'
}.freeze

Instance Method Summary collapse

Instance Method Details

#era_convertible? ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
# File 'lib/era_ja/conversion.rb', line 56

def era_convertible?
  self.to_time >= ::Time.mktime(1868,9,8)
end

#to_era(format = "%o%E.%m.%d", era_names: ERA_NAME_DEFAULTS) ⇒ String

Convert to Japanese era.

Parameters:

  • format_string (String) —

    Time#strftime format string can be used

    extra format string

    • %o - era(alphabet)
    • %O - era(kanzi)
    • %E - era year
    • %J - kanzi number
    • %K - kanzi number(After the second year, make it a number)
  • era_names (Hash) (defaults to: ERA_NAME_DEFAULTS) —

    If you want to convert custom to era strings (eg 平, h), you can set this argument. key is :meiji' or :taisho' or :showa or :heisei or :reiwa. value is ["alphabet era name"(ex h, s)(related to %o), "multibyte era name"(eg 平, 昭)(related to %O)]. this argument is same as one element of ERA_NAME_DEFAULTS.

Returns:

  • (String)

Raises:



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'lib/era_ja/conversion.rb', line 34

def to_era(format = "%o%E.%m.%d", era_names: ERA_NAME_DEFAULTS)
  raise EraJa::DateOutOfRangeError unless era_convertible?

  @era_format = format.gsub(Regexp.new(FORMAT_STRING_MAP.keys.join('|')), FORMAT_STRING_MAP)
  str_time = strftime(@era_format)
  if @era_format =~ /%(-?E|[Oo]|1O)/
    case
    when self.to_time < ::Time.mktime(1912,7,30)
      str_time = era_year(year - 1867, :meiji, era_names)
    when self.to_time < ::Time.mktime(1926,12,25)
      str_time = era_year(year - 1911, :taisho, era_names)
    when self.to_time < ::Time.mktime(1989,1,8)
      str_time = era_year(year - 1925, :showa, era_names)
    when self.to_time < ::Time.mktime(2019, 5, 1)
      str_time = era_year(year - 1988, :heisei, era_names)
    else
      str_time = era_year(year - 2018, :reiwa, era_names)
    end
  end
  str_time.gsub(/%J(\d+)/) { to_kanzi($1) }
end