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.
- checksums.yaml +4 -4
- data/lib/zakuro/calculation/monthly/abstract_lunar_phase.rb +169 -0
- data/lib/zakuro/calculation/range/medieval_annual_range.rb +105 -0
- data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +76 -0
- data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +52 -0
- data/lib/zakuro/calculation/stella/solar/abstract_average.rb +117 -0
- data/lib/zakuro/calculation/stella/solar/abstract_location.rb +187 -0
- data/lib/zakuro/calculation/stella/solar/choukei_value.rb +136 -0
- data/lib/zakuro/calculation/type/old_float.rb +69 -0
- data/lib/zakuro/version.rb +1 -1
- data/lib/zakuro/version/gihou/const/number.rb +55 -0
- data/lib/zakuro/version/gihou/const/remainder.rb +56 -0
- data/lib/zakuro/version/gihou/cycle/remainder.rb +61 -0
- data/lib/zakuro/version/gihou/cycle/solar_term.rb +34 -0
- data/lib/zakuro/version/gihou/gihou.rb +23 -2
- data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +106 -0
- data/lib/zakuro/version/gihou/range/annual_range.rb +39 -0
- data/lib/zakuro/version/gihou/stella/lunar/adjustment.rb +250 -0
- data/lib/zakuro/version/gihou/stella/lunar/localization.rb +44 -0
- data/lib/zakuro/version/gihou/stella/lunar/location.rb +86 -0
- data/lib/zakuro/version/gihou/stella/lunar/value.rb +74 -0
- data/lib/zakuro/version/gihou/stella/origin/average_november.rb +34 -0
- data/lib/zakuro/version/gihou/stella/origin/lunar_age.rb +62 -0
- data/lib/zakuro/version/gihou/stella/origin/winter_solstice.rb +55 -0
- data/lib/zakuro/version/gihou/stella/solar/adjustment.rb +93 -0
- data/lib/zakuro/version/gihou/stella/solar/average.rb +97 -0
- data/lib/zakuro/version/gihou/stella/solar/interval.rb +108 -0
- data/lib/zakuro/version/gihou/stella/solar/location.rb +61 -0
- data/lib/zakuro/version/gihou/stella/solar/value.rb +36 -0
- data/lib/zakuro/version/senmyou/const/number.rb +1 -1
- data/lib/zakuro/version/senmyou/const/remainder.rb +7 -1
- data/lib/zakuro/version/senmyou/cycle/solar_term.rb +4 -1
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +11 -111
- data/lib/zakuro/version/senmyou/range/annual_range.rb +5 -77
- data/lib/zakuro/version/senmyou/stella/lunar/localization.rb +2 -3
- data/lib/zakuro/version/senmyou/stella/lunar/location.rb +13 -28
- data/lib/zakuro/version/senmyou/stella/lunar/value.rb +5 -28
- data/lib/zakuro/version/senmyou/stella/solar/adjustment.rb +29 -29
- data/lib/zakuro/version/senmyou/stella/solar/average.rb +11 -89
- data/lib/zakuro/version/senmyou/stella/solar/location.rb +18 -121
- data/lib/zakuro/version/senmyou/stella/solar/value.rb +4 -103
- data/lib/zakuro/version/version_class_resolver.rb +4 -0
- metadata +28 -2
@@ -1,17 +1,8 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative '../../../
|
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
|
-
|
69
|
-
|
70
|
-
|
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
|
-
|
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
|
-
|
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:
|
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
|
94
|
-
|
95
|
-
@remainder.sub!(HALF_ANOMALISTIC_MONTH)
|
96
|
-
@forward = !@forward
|
97
|
-
end
|
85
|
+
return if remainder < limit
|
98
86
|
|
99
|
-
|
100
|
-
|
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 =
|
42
|
-
|
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
|
-
#
|
18
|
+
# Row 行データ
|
19
19
|
#
|
20
|
-
class
|
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<
|
51
|
+
# @return [Array<Row>] 24気損益眺朒(ちょうじく)数
|
52
52
|
MAP = {
|
53
|
-
touji:
|
54
|
-
shoukan:
|
55
|
-
daikan:
|
56
|
-
risshun:
|
57
|
-
usui:
|
58
|
-
keichitsu:
|
59
|
-
shunbun:
|
60
|
-
seimei:
|
61
|
-
kokuu:
|
62
|
-
rikka:
|
63
|
-
shouman:
|
64
|
-
boushu:
|
65
|
-
geshi:
|
66
|
-
shousho:
|
67
|
-
taisho:
|
68
|
-
risshuu:
|
69
|
-
shosho:
|
70
|
-
hakuro:
|
71
|
-
shuubun:
|
72
|
-
kanro:
|
73
|
-
soukou:
|
74
|
-
rittou:
|
75
|
-
shousetsu:
|
76
|
-
taisetsu:
|
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 [
|
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
|
-
|
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
|