zakuro 0.1.5 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
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