zakuro 0.1.5 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. checksums.yaml +4 -4
  2. data/lib/zakuro/calculation/monthly/abstract_lunar_phase.rb +169 -0
  3. data/lib/zakuro/calculation/range/medieval_annual_range.rb +105 -0
  4. data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +76 -0
  5. data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +52 -0
  6. data/lib/zakuro/calculation/stella/solar/abstract_average.rb +117 -0
  7. data/lib/zakuro/calculation/stella/solar/abstract_location.rb +187 -0
  8. data/lib/zakuro/calculation/stella/solar/choukei_value.rb +136 -0
  9. data/lib/zakuro/calculation/type/old_float.rb +69 -0
  10. data/lib/zakuro/version.rb +1 -1
  11. data/lib/zakuro/version/gihou/const/number.rb +55 -0
  12. data/lib/zakuro/version/gihou/const/remainder.rb +56 -0
  13. data/lib/zakuro/version/gihou/cycle/remainder.rb +61 -0
  14. data/lib/zakuro/version/gihou/cycle/solar_term.rb +34 -0
  15. data/lib/zakuro/version/gihou/gihou.rb +23 -2
  16. data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +106 -0
  17. data/lib/zakuro/version/gihou/range/annual_range.rb +39 -0
  18. data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +250 -0
  19. data/lib/zakuro/version/gihou/stella/lunar/localization.rb +44 -0
  20. data/lib/zakuro/version/gihou/stella/lunar/location.rb +86 -0
  21. data/lib/zakuro/version/gihou/stella/lunar/value.rb +74 -0
  22. data/lib/zakuro/version/gihou/stella/origin/average_november.rb +34 -0
  23. data/lib/zakuro/version/gihou/stella/origin/lunar_age.rb +62 -0
  24. data/lib/zakuro/version/gihou/stella/origin/winter_solstice.rb +55 -0
  25. data/lib/zakuro/version/gihou/stella/solar/adjustment.rb +93 -0
  26. data/lib/zakuro/version/gihou/stella/solar/average.rb +97 -0
  27. data/lib/zakuro/version/gihou/stella/solar/interval.rb +108 -0
  28. data/lib/zakuro/version/gihou/stella/solar/location.rb +61 -0
  29. data/lib/zakuro/version/gihou/stella/solar/value.rb +36 -0
  30. data/lib/zakuro/version/senmyou/const/number.rb +1 -1
  31. data/lib/zakuro/version/senmyou/const/remainder.rb +7 -1
  32. data/lib/zakuro/version/senmyou/cycle/solar_term.rb +4 -1
  33. data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +11 -111
  34. data/lib/zakuro/version/senmyou/range/annual_range.rb +5 -77
  35. data/lib/zakuro/version/senmyou/stella/lunar/localization.rb +2 -3
  36. data/lib/zakuro/version/senmyou/stella/lunar/location.rb +13 -28
  37. data/lib/zakuro/version/senmyou/stella/lunar/value.rb +5 -28
  38. data/lib/zakuro/version/senmyou/stella/solar/adjustment.rb +29 -29
  39. data/lib/zakuro/version/senmyou/stella/solar/average.rb +11 -89
  40. data/lib/zakuro/version/senmyou/stella/solar/location.rb +18 -121
  41. data/lib/zakuro/version/senmyou/stella/solar/value.rb +4 -103
  42. data/lib/zakuro/version/version_class_resolver.rb +4 -0
  43. metadata +28 -2
@@ -1,17 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative '../../../output/logger'
4
- require_relative '../cycle/remainder'
5
- require_relative '../cycle/solar_term'
6
- require_relative '../../../calculation/monthly/initialized_month'
3
+ require_relative '../../../calculation/range/medieval_annual_range'
7
4
  require_relative '../monthly/lunar_phase'
8
- require_relative '../stella/lunar/location'
9
- require_relative '../stella/lunar/value'
10
5
  require_relative '../stella/solar/average'
11
- require_relative '../stella/solar/location'
12
- require_relative '../stella/solar/value'
13
- require_relative '../stella/origin/lunar_age'
14
- require_relative '../stella/origin/average_november'
15
6
 
16
7
  # :nodoc:
17
8
  module Zakuro
@@ -23,11 +14,6 @@ module Zakuro
23
14
  # AnnualRange 年間範囲
24
15
  #
25
16
  module AnnualRange
26
- # @return [Output::Logger] ロガー
27
- LOGGER = Output::Logger.new(location: 'annual_range')
28
-
29
- # :reek:TooManyStatements { max_statements: 6 }
30
-
31
17
  #
32
18
  # 一覧取得する
33
19
  #
@@ -40,71 +26,13 @@ module Zakuro
40
26
  # @return [Array<Month>] 1年データ
41
27
  #
42
28
  def self.get(context:, western_year:)
43
- annual_range = initialized_annual_range(context: context, western_year: western_year)
44
-
45
- apply_big_and_small_of_the_month(annual_range: annual_range)
46
-
47
- solar_average = Solar::Average.new(western_year: western_year)
48
- solar_average.set(annual_range: annual_range)
49
-
50
- # 月間隔を取得するためだけの末尾要素を削除
51
- annual_range.pop
52
-
53
- initialize_month_label(annual_range: annual_range)
54
- end
55
-
56
- #
57
- # 1年データを取得する
58
- #
59
- # @param [Context] context 暦コンテキスト
60
- # @param [Integer] western_year 西暦年
61
- #
62
- # @return [Array<Month>] 1年データ
63
- #
64
- def self.initialized_annual_range(context:, western_year:)
65
- result = []
66
29
  lunar_phase = Monthly::LunarPhase.new(western_year: western_year)
30
+ solar_average = Solar::Average.new(western_year: western_year)
67
31
 
68
- # 14ヶ月分を生成する(閏年で最大13ヶ月 + 末月の大小/二十四節気を求めるために必要な月)
69
- (0..13).each do |_index|
70
- adjusted = lunar_phase.next_month
71
-
72
- result.push(
73
- Calculation::Monthly::InitializedMonth.new(
74
- context: context,
75
- month_label: Calculation::Monthly::MonthLabel.new,
76
- first_day: Calculation::Monthly::FirstDay.new(remainder: adjusted),
77
- phase_index: 0
78
- )
79
- )
80
- end
81
-
82
- result
83
- end
84
- private_class_method :initialized_annual_range
85
-
86
- #
87
- # 1年データの各月に月の大小を設定する
88
- #
89
- # @param [Array<Month>] annual_range 1年データ
90
- #
91
- def self.apply_big_and_small_of_the_month(annual_range:)
92
- # NOTE: 最後の月は処理できない(=計算外の余分な月が最後に必要である)
93
- annual_range.each_cons(2) do |(current_month, next_month)|
94
- current_month.eval_many_days(next_month_day: next_month.remainder.day)
95
- end
96
- end
97
- private_class_method :apply_big_and_small_of_the_month
98
-
99
- #
100
- # 月表示情報を更新する
101
- #
102
- # @param [Array<Month>] annual_range 1年データ
103
- #
104
- def self.initialize_month_label(annual_range:)
105
- annual_range.each(&:rename_month_label_by_solar_term)
32
+ Calculation::Range::MedievalAnnualRange.get(
33
+ context: context, lunar_phase: lunar_phase, solar_average: solar_average
34
+ )
106
35
  end
107
- private_class_method :initialize_month_label
108
36
  end
109
37
  end
110
38
  end
@@ -12,7 +12,7 @@ module Zakuro
12
12
  # Localization 入暦特定
13
13
  #
14
14
  module Localization
15
- # @return [Integer] 1近日点
15
+ # @return [Integer] 1近点月
16
16
  ANOMALISTIC_MONTH = Const::Number::Cycle::ANOMALISTIC_MONTH
17
17
  # @return [Integer] 積年
18
18
  TOTAL_YEAR = Const::Number::Stack::TOTAL_YEAR
@@ -34,8 +34,7 @@ module Zakuro
34
34
  total_year = TOTAL_YEAR + western_year - BEGIN_YEAR
35
35
 
36
36
  # 通積分 - 天正閏余
37
- total_day = \
38
- total_year * YEAR - lunar_age.to_minute
37
+ total_day = total_year * YEAR - lunar_age.to_minute
39
38
 
40
39
  Cycle::LunarRemainder.new(total: (total_day % ANOMALISTIC_MONTH))
41
40
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/lunar/abstract_location'
4
+
3
5
  require_relative '../../const/remainder'
4
6
 
5
7
  require_relative './localization'
@@ -13,38 +15,28 @@ module Zakuro
13
15
  #
14
16
  # Location 入暦
15
17
  #
16
- class Location
17
- # @return [Cycle::LunarRemainder] 暦中日
18
+ class Location < Calculation::Lunar::AbstractLocation
19
+ # @return [Cycle::LunarRemainder] 暦中日(1近点月の半分)
18
20
  HALF_ANOMALISTIC_MONTH = Const::Remainder::Lunar::HALF_ANOMALISTIC_MONTH
19
21
  # @return [Cycle::LunarRemainder] 入暦上限
20
22
  LIMIT = Const::Remainder::Lunar::LIMIT
21
23
  # @return [Cycle::LunarRemainder] 弦
22
24
  QUARTER = Const::Remainder::Lunar::QUARTER
23
25
 
24
- # @return [True] 計算済み(前回計算あり)
25
- # @return [False] 未計算(初回計算)
26
- attr_reader :calculated
27
- # @return [Integer] 西暦年
28
- attr_reader :western_year
29
- # @return [True] 進(遠地点より数える)
30
- # @return [False] 退(近地点より数える)
26
+ # @return [True]
27
+ # @return [False] 退
31
28
  attr_reader :forward
32
- # @return [Cycle::LunarRemainder] 大余小余(初回:昨年天正閏余)
33
- attr_reader :remainder
34
29
 
35
30
  #
36
31
  # 初期化
37
32
  #
38
33
  # @param [Cycle::LunarRemainder] lunar_age 天正閏余(大余小余)
39
34
  # @param [Integer] western_year 西暦年
40
- # @param [True, False] forward 進(遠地点より数える)/退(近地点より数える)
41
35
  #
42
36
  def initialize(lunar_age:, western_year:)
43
- @calculated = false
44
- @western_year = western_year
37
+ super(lunar_age: lunar_age, western_year: western_year)
45
38
  # 進
46
39
  @forward = true
47
- @remainder = lunar_age
48
40
  end
49
41
 
50
42
  #
@@ -64,7 +56,7 @@ module Zakuro
64
56
  # 弦の分だけ月地点を進める
65
57
  #
66
58
  def add_quarter
67
- @remainder.add!(QUARTER)
59
+ remainder.add!(QUARTER)
68
60
  end
69
61
 
70
62
  private
@@ -74,9 +66,9 @@ module Zakuro
74
66
  #
75
67
  def first
76
68
  @remainder = Localization.first_remainder(
77
- lunar_age: @remainder, western_year: @western_year
69
+ lunar_age: remainder, western_year: western_year
78
70
  )
79
- # 初回は0始まりで計算しているので、暦中日を用いる
71
+ # 初回は0始まりで計算しているので、入暦上限ではなく暦中日を用いる
80
72
  decrease(limit: HALF_ANOMALISTIC_MONTH)
81
73
  # 1始まりに改める
82
74
  one_based
@@ -90,17 +82,10 @@ module Zakuro
90
82
  # @param [Cycle::LunarRemainder] limit 上限
91
83
  #
92
84
  def decrease(limit:)
93
- return if @remainder < limit
94
-
95
- @remainder.sub!(HALF_ANOMALISTIC_MONTH)
96
- @forward = !@forward
97
- end
85
+ return if remainder < limit
98
86
 
99
- #
100
- # 1始まりにする
101
- #
102
- def one_based
103
- @remainder.add!(Cycle::Remainder.new(day: 1, minute: 0, second: 0))
87
+ remainder.sub!(HALF_ANOMALISTIC_MONTH)
88
+ @forward = !forward
104
89
  end
105
90
  end
106
91
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/lunar/choukei_value'
4
+
3
5
  require_relative '../../cycle/remainder'
4
6
 
5
7
  require_relative './adjustment'
@@ -34,12 +36,12 @@ module Zakuro
34
36
  row = Adjustment.specify(forward: forward, day: day, minute: minute)
35
37
 
36
38
  value = row.value
37
- denominator = row.denominator
38
39
 
39
40
  minus_minute = Adjustment.minus_minute(day: day, minute: minute)
40
41
 
41
- day = calc_day(per: value.per, denominator: denominator,
42
- minute: minus_minute)
42
+ day = Calculation::Lunar::ChoukeiValue.rounded_day(
43
+ per: value.per, denominator: row.denominator, minute: minus_minute
44
+ )
43
45
 
44
46
  value.stack + day
45
47
  end
@@ -58,31 +60,6 @@ module Zakuro
58
60
  raise ArgumentError, "unmatch parameter type: #{remainder.class}"
59
61
  end
60
62
  private_class_method :valid?
61
-
62
- # :reek:TooManyStatements { max_statements: 9 }
63
-
64
- #
65
- # 累計値(大余)を作成する
66
- #
67
- # @param [Integer] per 入暦(1-14)
68
- # @param [Integer] denominator 小余の分母
69
- # @param [Integer] minute 小余
70
- #
71
- # @return [Integer] 累計値(大余)
72
- #
73
- def self.calc_day(per:, denominator:, minute:)
74
- remainder_minute = (per * minute).to_f
75
- day = remainder_minute / denominator
76
- # 切り捨て(プラスマイナスに関わらず小数点以下切り捨て)
77
- day = day.negative? ? day.ceil : day.floor
78
- sign = remainder_minute.negative? ? -1 : 1
79
- remainder_day = (sign * remainder_minute) % denominator
80
- # 四捨五入(8400ならその半分の4200以上を繰り上げる)
81
- day += sign if remainder_day >= (denominator / 2)
82
-
83
- day
84
- end
85
- private_class_method :calc_day
86
63
  end
87
64
  end
88
65
  end
@@ -15,9 +15,9 @@ module Zakuro
15
15
  #
16
16
  module Adjustment
17
17
  #
18
- # Item 24気損益眺朒(ちょうじく)数
18
+ # Row 行データ
19
19
  #
20
- class Item
20
+ class Row
21
21
  # @return [Integer] 眺朒(ちょうじく)積
22
22
  attr_reader :stack
23
23
  # @return [Integer] 眺朒(ちょうじく)数
@@ -48,40 +48,40 @@ module Zakuro
48
48
  end
49
49
  end
50
50
 
51
- # @return [Array<Item>] 24気損益眺朒(ちょうじく)数
51
+ # @return [Array<Row>] 24気損益眺朒(ちょうじく)数
52
52
  MAP = {
53
- touji: Item.new(stack: 0.0, per_term: +33.4511, per_day: -0.3695), # 冬至(とうじ)
54
- shoukan: Item.new(stack: +449.0, per_term: +28.0389, per_day: -0.3606), # 小寒(しょうかん)
55
- daikan: Item.new(stack: +823.0, per_term: +22.6998, per_day: -0.3519), # 大寒(だいかん)
56
- risshun: Item.new(stack: +1122.0, per_term: +17.8923, per_day: -0.4068), # 立春(りっしゅん)
57
- usui: Item.new(stack: +1346.0, per_term: +11.7966, per_day: -0.3998), # 雨水(うすい)
58
- keichitsu: Item.new(stack: +1481.0, per_term: +5.7986, per_day: -0.3998), # 啓蟄(けいちつ)
59
- shunbun: Item.new(stack: +1526.0, per_term: -0.2433, per_day: -0.3779), # 春分(しゅんぶん)
60
- seimei: Item.new(stack: +1481.0, per_term: -6.1254, per_day: -0.3634), # 清明(せいめい)
61
- kokuu: Item.new(stack: +1346.0, per_term: -12.2048, per_day: -0.2987), # 穀雨(こくう)
62
- rikka: Item.new(stack: +1122.0, per_term: -16.9060, per_day: -0.2919), # 立夏(りっか)
63
- shouman: Item.new(stack: +823.0, per_term: -21.5362, per_day: -0.2854), # 小満(しょうまん)
64
- boushu: Item.new(stack: +449.0, per_term: -26.0498, per_day: -0.2854), # 芒種(ぼうしゅ)
65
- geshi: Item.new(stack: 0.0, per_term: -30.3119, per_day: +0.2854), # 夏至(げし)
66
- shousho: Item.new(stack: -449.0, per_term: -25.8126, per_day: +0.2919), # 小暑(しょうしょ)
67
- taisho: Item.new(stack: -823.0, per_term: -21.2454, per_day: +0.2987), # 大暑(たいしょ)
68
- risshuu: Item.new(stack: -1122.0, per_term: -17.0296, per_day: +0.3634), # 立秋(りっしゅう)
69
- shosho: Item.new(stack: -1346.0, per_term: -11.4744, per_day: +0.3779), # 処暑(しょしょ)
70
- hakuro: Item.new(stack: -1481.0, per_term: -5.6429, per_day: +0.3779), # 白露(はくろ)
71
- shuubun: Item.new(stack: -1526.0, per_term: +0.1432, per_day: +0.3998), # 秋分(しゅうぶん)
72
- kanro: Item.new(stack: -1481.0, per_term: +6.1488, per_day: +0.4068), # 寒露(かんろ)
73
- soukou: Item.new(stack: -1346.0, per_term: +12.6336, per_day: +0.3519), # 霜降(そうこう)
74
- rittou: Item.new(stack: -1122.0, per_term: +17.8043, per_day: +0.3606), # 立冬(りっとう)
75
- shousetsu: Item.new(stack: -823.0, per_term: +23.0590, per_day: +0.3695), # 小雪(しょうせつ)
76
- taisetsu: Item.new(stack: -449.0, per_term: +28.4618, per_day: +0.3695) # 大雪(たいせつ)
53
+ touji: Row.new(stack: 0.0, per_term: +33.4511, per_day: -0.3695), # 冬至(とうじ)
54
+ shoukan: Row.new(stack: +449.0, per_term: +28.0389, per_day: -0.3606), # 小寒(しょうかん)
55
+ daikan: Row.new(stack: +823.0, per_term: +22.6998, per_day: -0.3519), # 大寒(だいかん)
56
+ risshun: Row.new(stack: +1122.0, per_term: +17.8923, per_day: -0.4068), # 立春(りっしゅん)
57
+ usui: Row.new(stack: +1346.0, per_term: +11.7966, per_day: -0.3998), # 雨水(うすい)
58
+ keichitsu: Row.new(stack: +1481.0, per_term: +5.7986, per_day: -0.3998), # 啓蟄(けいちつ)
59
+ shunbun: Row.new(stack: +1526.0, per_term: -0.2433, per_day: -0.3779), # 春分(しゅんぶん)
60
+ seimei: Row.new(stack: +1481.0, per_term: -6.1254, per_day: -0.3634), # 清明(せいめい)
61
+ kokuu: Row.new(stack: +1346.0, per_term: -12.2048, per_day: -0.2987), # 穀雨(こくう)
62
+ rikka: Row.new(stack: +1122.0, per_term: -16.9060, per_day: -0.2919), # 立夏(りっか)
63
+ shouman: Row.new(stack: +823.0, per_term: -21.5362, per_day: -0.2854), # 小満(しょうまん)
64
+ boushu: Row.new(stack: +449.0, per_term: -26.0498, per_day: -0.2854), # 芒種(ぼうしゅ)
65
+ geshi: Row.new(stack: 0.0, per_term: -30.3119, per_day: +0.2854), # 夏至(げし)
66
+ shousho: Row.new(stack: -449.0, per_term: -25.8126, per_day: +0.2919), # 小暑(しょうしょ)
67
+ taisho: Row.new(stack: -823.0, per_term: -21.2454, per_day: +0.2987), # 大暑(たいしょ)
68
+ risshuu: Row.new(stack: -1122.0, per_term: -17.0296, per_day: +0.3634), # 立秋(りっしゅう)
69
+ shosho: Row.new(stack: -1346.0, per_term: -11.4744, per_day: +0.3779), # 処暑(しょしょ)
70
+ hakuro: Row.new(stack: -1481.0, per_term: -5.6429, per_day: +0.3779), # 白露(はくろ)
71
+ shuubun: Row.new(stack: -1526.0, per_term: +0.1432, per_day: +0.3998), # 秋分(しゅうぶん)
72
+ kanro: Row.new(stack: -1481.0, per_term: +6.1488, per_day: +0.4068), # 寒露(かんろ)
73
+ soukou: Row.new(stack: -1346.0, per_term: +12.6336, per_day: +0.3519), # 霜降(そうこう)
74
+ rittou: Row.new(stack: -1122.0, per_term: +17.8043, per_day: +0.3606), # 立冬(りっとう)
75
+ shousetsu: Row.new(stack: -823.0, per_term: +23.0590, per_day: +0.3695), # 小雪(しょうせつ)
76
+ taisetsu: Row.new(stack: -449.0, per_term: +28.4618, per_day: +0.3695) # 大雪(たいせつ)
77
77
  }.freeze
78
78
 
79
79
  #
80
- # 24気損益眺朒(ちょうじく)数を特定する
80
+ # 24気損益眺朒(ちょうじく)数の行データを特定する
81
81
  #
82
82
  # @param [Integer] index 連番(二十四節気)
83
83
  #
84
- # @return [Adjustment::Item] 24気損益眺朒(ちょうじく)数
84
+ # @return [Row] 行データ
85
85
  #
86
86
  def self.specify(index:)
87
87
  key = Cycle::SolarTerm::ORDER[index]
@@ -1,9 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative '../../../../calculation/stella/solar/abstract_average'
4
+
3
5
  require_relative '../../const/remainder'
4
6
 
7
+ require_relative '../../cycle/solar_term'
8
+
5
9
  require_relative '../origin/winter_solstice'
6
10
 
11
+ require_relative './location'
12
+
7
13
  # :nodoc:
8
14
  module Zakuro
9
15
  # :nodoc:
@@ -11,19 +17,17 @@ module Zakuro
11
17
  # :nodoc:
12
18
  module Solar
13
19
  #
14
- # Average 常気(太陽軌道平均)
20
+ # Average 平気(太陽軌道平均)
15
21
  #
16
- class Average
17
- # @return [Remainder] 気策
18
- SOLAR_TERM_AVERAGE = Const::Remainder::Solar::SOLAR_TERM_AVERAGE
19
-
22
+ class Average < Calculation::Solar::AbstractAverage
20
23
  #
21
24
  # 初期化
22
25
  #
23
26
  # @param [Integer] western_year 西暦年
24
27
  #
25
28
  def initialize(western_year:)
26
- @solar_term = Average.first_solar_term(western_year: western_year)
29
+ solar_term = Average.first_solar_term(western_year: western_year)
30
+ super(solar_term: solar_term)
27
31
  end
28
32
 
29
33
  #
@@ -34,16 +38,7 @@ module Zakuro
34
38
  # @return [Array<Month>] 1年データ
35
39
  #
36
40
  def set(annual_range:)
37
- # 次月と比較しながら当月の二十四節気を決める
38
- # NOTE: 最後の月は処理できない(=計算外の余分な月が最後に必要である)
39
- annual_range.each_cons(2) do |(current_month, next_month)|
40
- set_solar_term(
41
- current_month: current_month,
42
- next_month: next_month
43
- )
44
- end
45
-
46
- annual_range
41
+ super(annual_range: annual_range)
47
42
  end
48
43
 
49
44
  #
@@ -96,79 +91,6 @@ module Zakuro
96
91
 
97
92
  solar_term_index
98
93
  end
99
-
100
- # :reek:TooManyStatements { max_statements: 7 }
101
-
102
- #
103
- # 月内(当月朔日から当月末日(来月朔日の前日)の間)に二十四節気があるか
104
- # @note 大余60で一巡するため 以下2パターンがある
105
- # * current_month <= next_month : (二十四節気) >= current_month && (二十四節気) < next_month
106
- # * current_month > next_month : (二十四節気) >= current_month || (二十四節気) < next_month
107
- #
108
- # @param [Remainder] solar_term 二十四節気
109
- # @param [Remainder] current_month 月初
110
- # @param [Remainder] next_month 月末
111
- #
112
- # @return [True] 対象の二十四節気がある
113
- # @return [False] 対象の二十四節気がない
114
- #
115
- def self.in_solar_term?(solar_term:, current_month:, next_month:)
116
- # 大余で比較する
117
- target_time = solar_term.day
118
- current_month_time = current_month.day
119
- next_month_time = next_month.day
120
- current_month_over = (target_time >= current_month_time)
121
- next_month_under = (target_time < next_month_time)
122
-
123
- return current_month_over && next_month_under if current_month_time <= next_month_time
124
-
125
- current_month_over || next_month_under
126
- end
127
-
128
- private
129
-
130
- # :reek:TooManyStatements { max_statements: 8 }
131
-
132
- #
133
- # 二十四節気を設定する
134
- #
135
- # @param [Month] current_month 当月
136
- # @param [Month] next_month 次月
137
- #
138
- def set_solar_term(current_month:, next_month:)
139
- # 安全策として無限ループは回避する
140
- # * 最大試行回数:4回(設定なし => 設定あり => 設定あり => 設定なし)
141
- # * 閏月は1回しか設定しない
142
- # * 最大2回設定する(中気・節気)
143
- (0..3).each do |_index|
144
- in_range = Average.in_solar_term?(
145
- solar_term: @solar_term.remainder, current_month: current_month.remainder,
146
- next_month: next_month.remainder
147
- )
148
-
149
- # 範囲外
150
- unless in_range
151
- # 1つ以上設定されていれば切り上げる(一つ飛ばしで二十四節気を設定することはない)
152
- break unless current_month.empty_solar_term?
153
-
154
- next_solar_term
155
- next
156
- end
157
-
158
- current_month.add_term(term: @solar_term.clone)
159
- next_solar_term
160
-
161
- # 宣明暦は最大2つまで
162
- break if current_month.solar_term_size == 2
163
- end
164
- end
165
-
166
- #
167
- # 次の二十四節気に移る
168
- #
169
- def next_solar_term
170
- @solar_term.next_term!
171
- end
172
94
  end
173
95
  end
174
96
  end