module EraJa::Conversion

Constants

ERA_NAME_DEFAULTS
FORMAT_STRING_MAP

Public Instance Methods

era_convertible?() click to toggle source
# File lib/era_ja/conversion.rb, line 55
def era_convertible?
  self.to_time >= ::Time.mktime(1868,9,8)
end
to_era(format = "%o%E.%m.%d", era_names: ERA_NAME_DEFAULTS) click to toggle source

Convert to Japanese era. @param [String] format_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)

@param [Hash] era_names

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.

@return [String]

# File lib/era_ja/conversion.rb, line 33
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

Private Instance Methods

era_year(year, era, era_names) click to toggle source
# File lib/era_ja/conversion.rb, line 60
def era_year(year, era, era_names)
  strftime(@era_format)
    .sub(Regexp.new("(#{FORMAT_STRING_MAP.keys.join('|')})?(%-?E)")) { format_year(year, $1, $2) }
    .sub(/%1?o/i) { format_era(era, era_names) }
end
format_era(era, era_names) click to toggle source
# File lib/era_ja/conversion.rb, line 66
def format_era(era, era_names)
  case
  when @era_format =~ /%o/
    era_names.fetch(era)[0]
  when @era_format =~ /%1O/
    era_names.fetch(era)[1][0]
  when @era_format =~ /%O/
    era_names.fetch(era)[1]
  end
end
format_year(year, match, digit) click to toggle source
# File lib/era_ja/conversion.rb, line 77
def format_year(year, match, digit)
  era_year = sprintf("%02d", year)

  if %w(%J %K).include?(match)
    return "元" if year == 1

    return to_kanzi(era_year) if match == "%J"
  end

  era_year = if digit == "%-E"
    sprintf("%01d", year)
  else
    sprintf("%02d", year)
  end

  era_year
end
to_kanzi(numeric, kanzi = "") click to toggle source
# File lib/era_ja/conversion.rb, line 95
def to_kanzi(numeric, kanzi = "")
  figures = (10 ** numeric.to_s.size) / 10
  numeric = numeric.to_i
  kanzi_string = ["", "一", "二", "三", "四", "五", "六", "七", "八", "九"]
  figures_string = { 1000 => "千", 100 => "百", 10 => "十", 1 => "" }
  return kanzi + kanzi_string[numeric] if figures == 1

  numeral = numeric / figures
  if numeral > 1
    to_kanzi(numeric - numeral * figures, "#{kanzi}#{kanzi_string[numeral]}#{figures_string[figures]}")
  elsif numeral == 1
    to_kanzi(numeric - numeral * figures, "#{kanzi}#{figures_string[figures]}")
  else
    to_kanzi(numeric - numeral * figures, kanzi)
  end
end