class Zakuro::Calculation::Base::MultiGengouRoller

MultiGengouRoller 改元処理

Attributes

current_date[R]

@return [Western::Calendar] 現在日

multi_gengou[R]

@return [MultiGengou] 複数元号

newest_date[R]

@return [Western::Calendar] 元号内での最未来日(元号が2つある場合は再未来の日付になる)

oldest_date[R]

@return [Western::Calendar] 元旦(元号が2つある場合は再過去の日付になる)

Public Class Methods

choise_date(condition:, second_line:, first_date:, second_date:) click to toggle source

条件を元に日付を求める

@param [Proc] condition 比較条件 @param [Japan::Gengou] second_line 元号(2行目) @param [Western::Calendar] first_date 比較対象(1行目) @param [Western::Calendar] second_date 比較対象(2行目)

@return [Western::Calendar] 比較結果

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 197
def self.choise_date(condition:, second_line:, first_date:, second_date:)
  # first_lineは常に存在する
  return first_date if second_line.invalid?

  condition.call(first_date, second_date)
end
choise_newest_gengou_date(first_line:, second_line:) click to toggle source

元号内での最未来日を求める @note 2つの元号が重複した場合はより未来の日となる

@param [Japan::Gengou] first_line 元号(1行目) @param [Japan::Gengou] second_line 元号(2行目)

@return [Western::Calendar] 最未来日

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 176
def self.choise_newest_gengou_date(first_line:, second_line:)
  condition = lambda do |first_date, second_date|
    first_date > second_date ? first_date : second_date
  end
  choise_date(condition: condition, second_line: second_line,
              first_date: first_line.end_date.clone,
              second_date: second_line.end_date.clone)
end
choise_oldest_gengou_date(first_line:, second_line:) click to toggle source

最過去の元旦を求める @note 2つの元号が重複した場合はより過去の日となる

@param [Japan::Gengou] first_line 元号(1行目) @param [Japan::Gengou] second_line 元号(2行目)

@return [Western::Calendar] 最過去の元旦

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 158
def self.choise_oldest_gengou_date(first_line:, second_line:)
  condition = lambda do |first_date, second_date|
    first_date < second_date ? first_date : second_date
  end
  choise_date(condition: condition, second_line: second_line,
              first_date: first_line.new_year_date.clone,
              second_date: second_line.new_year_date.clone)
end
first_line(date: Western::Calender.new) click to toggle source

元号(1行目)を取得する

@return [Japan::Gengou] 元号(1行目)

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 98
def self.first_line(date: Western::Calender.new)
  Japan::GengouResource.first_line(date: date)
end
new(start_date: Western::Calendar.new, end_date: Western::Calendar.new) click to toggle source
# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 26
def initialize(start_date: Western::Calendar.new, end_date: Western::Calendar.new)
  end_date = start_date if end_date.invalid?

  @oldest_date = MultiGengouRoller.choise_oldest_gengou_date(
    first_line: MultiGengouRoller.first_line(date: start_date),
    second_line: MultiGengouRoller.second_line(date: start_date)
  )
  @current_date = @oldest_date.clone
  @newest_date = MultiGengouRoller.choise_newest_gengou_date(
    first_line: MultiGengouRoller.first_line(date: end_date),
    second_line: MultiGengouRoller.second_line(date: end_date)
  )

  @multi_gengou = MultiGengou.new(
    first_line: current_first_line,
    second_line: current_second_line,
    new_year_date: @oldest_date
  )
end
second_line(date: Western::Calender.new) click to toggle source

元号(2行目)を取得する

@return [Japan::Gengou] 元号(2行目)

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 107
def self.second_line(date: Western::Calender.new)
  Japan::GengouResource.second_line(date: date)
end
transfer(multi_gengou:, date:) click to toggle source

改元する

@param [MultiGengou] multi_gengou 複数元号 @param [Western::Calendar] date 対象日

@return [MultiGengou] 改元済み複数元号

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 119
def self.transfer(multi_gengou:, date:)
  multi_gengou.transfer(
    first_line: first_line(date: date),
    second_line: second_line(date: date)
  )

  multi_gengou
end

Public Instance Methods

choise_nearest_end_date() click to toggle source

現在日からみて直近の未来に対する元号の切替前日を求める @note 2つの元号が重複した場合はより過去の日となる

@param [Japan::Gengou] first_line 元号(1行目) @param [Japan::Gengou] second_line 元号(2行目)

@return [Western::Calendar] 元号の切替前日

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 137
def choise_nearest_end_date
  condition = lambda do |first_date, second_date|
    first_date < second_date ? first_date : second_date
  end

  second_line = current_second_line

  MultiGengouRoller.choise_date(condition: condition, second_line: second_line,
                                first_date: current_first_line.end_date.clone,
                                second_date: second_line.end_date.clone)
end
current_first_line() click to toggle source

現在日から元号(1行目)を取得する

@return [Japan::Gengou] 元号(1行目)

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 62
def current_first_line
  MultiGengouRoller.first_line(date: @current_date)
end
current_second_line() click to toggle source

現在日から元号(2行目)を取得する

@return [Japan::Gengou] 元号(2行目)

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 71
def current_second_line
  MultiGengouRoller.second_line(date: @current_date)
end
initialize_copy(obj) click to toggle source

ディープコピー

@param [MultiGengou] obj 自身

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 209
def initialize_copy(obj)
  @oldest_date = obj.oldest_date.clone
  @current_date = obj.current_date.clone
  @newest_date = obj.newest_date.clone
  @multi_gengou = obj.multi_gengou.clone
end
next(days: 0) click to toggle source

現在日付を未来に進める

@param [<Type>] days <description>

@return [<Type>] <description>

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 53
def next(days: 0)
  @current_date += days
end
next_year() click to toggle source

次年にする

@return [MultiGengou] 複数元号

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 89
def next_year
  @multi_gengou.next_year
end
transfer() click to toggle source

改元する

@return [MultiGengou] 複数元号

# File lib/zakuro/calculation/base/multi_gengou_roller.rb, line 80
def transfer
  MultiGengouRoller.transfer(multi_gengou: @multi_gengou, date: @current_date)
end