zakuro 0.0.2 → 0.1.3
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/.rubocop.yml +3 -0
- data/README.md +102 -42
- data/doc/operation.md +25 -0
- data/doc/operation/csv/month.csv +202 -0
- data/doc/operation/operation.xlsx +0 -0
- data/doc/operation/transfer.rb +77 -0
- data/lib/zakuro/calculation/base/multi_gengou.rb +101 -0
- data/lib/zakuro/calculation/base/multi_gengou_roller.rb +218 -0
- data/lib/zakuro/calculation/base/year.rb +107 -0
- data/lib/zakuro/calculation/cycle/abstract_remainder.rb +459 -0
- data/lib/zakuro/calculation/cycle/abstract_solar_term.rb +151 -0
- data/lib/zakuro/calculation/cycle/zodiac.rb +106 -0
- data/lib/zakuro/calculation/monthly/first_day.rb +45 -0
- data/lib/zakuro/calculation/monthly/initialized_month.rb +120 -0
- data/lib/zakuro/calculation/monthly/month.rb +184 -0
- data/lib/zakuro/calculation/monthly/month_label.rb +88 -0
- data/lib/zakuro/calculation/monthly/operated_month.rb +201 -0
- data/lib/zakuro/calculation/range/full_range.rb +210 -0
- data/lib/zakuro/calculation/range/operated_range.rb +134 -0
- data/lib/zakuro/calculation/range/operated_solar_terms.rb +201 -0
- data/lib/zakuro/calculation/range/transfer/western_date_allocation.rb +76 -0
- data/lib/zakuro/calculation/range/transfer/year_boundary.rb +142 -0
- data/lib/zakuro/calculation/specifier/single_day.rb +109 -0
- data/lib/zakuro/calculation/summary/single.rb +129 -0
- data/lib/zakuro/condition.rb +17 -13
- data/lib/zakuro/era/japan/gengou.rb +106 -0
- data/lib/zakuro/era/japan/gengou/parser.rb +167 -0
- data/lib/zakuro/era/japan/gengou/type.rb +178 -0
- data/lib/zakuro/era/japan/gengou/validator.rb +236 -0
- data/lib/zakuro/era/japan/reki.rb +91 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-001-until-south.yaml +0 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-002-from-north.yaml +0 -0
- data/lib/zakuro/era/{gengou → japan/yaml}/set-003-modern.yaml +1 -1
- data/lib/zakuro/era/western.rb +1 -1
- data/lib/zakuro/merchant.rb +2 -2
- data/lib/zakuro/operation/month/parser.rb +373 -0
- data/lib/zakuro/operation/month/type.rb +453 -0
- data/lib/zakuro/operation/month/validator.rb +802 -0
- data/lib/zakuro/operation/operation.rb +66 -0
- data/lib/zakuro/operation/yaml/month.yaml +6452 -0
- data/lib/zakuro/output/error.rb +7 -4
- data/lib/zakuro/output/logger.rb +50 -47
- data/lib/zakuro/output/response.rb +146 -143
- data/lib/zakuro/result/core.rb +52 -0
- data/lib/zakuro/result/data.rb +187 -0
- data/lib/zakuro/result/operation.rb +114 -0
- data/lib/zakuro/result/result.rb +37 -0
- data/lib/zakuro/{output → tools}/stringifier.rb +16 -9
- data/lib/zakuro/tools/typeof.rb +33 -0
- data/lib/zakuro/version.rb +1 -1
- data/lib/zakuro/version/abstract_version.rb +1 -1
- data/lib/zakuro/version/context.rb +23 -0
- data/lib/zakuro/version/senmyou/cycle/remainder.rb +63 -0
- data/lib/zakuro/version/senmyou/cycle/solar_term.rb +31 -0
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +186 -182
- data/lib/zakuro/version/senmyou/range/annual_range.rb +164 -0
- data/lib/zakuro/version/senmyou/senmyou.rb +10 -4
- data/lib/zakuro/version/senmyou/stella/lunar_orbit.rb +7 -7
- data/lib/zakuro/version/senmyou/stella/solar_average.rb +103 -138
- data/lib/zakuro/version/senmyou/stella/solar_location.rb +213 -0
- data/lib/zakuro/version/senmyou/stella/solar_orbit.rb +6 -191
- data/lib/zakuro/version/senmyou/stella/winter_solstice.rb +4 -4
- data/lib/zakuro/version/version_class_resolver.rb +62 -0
- data/lib/zakuro/version_factory.rb +3 -3
- metadata +49 -20
- data/lib/zakuro/cycle/abstract_remainder.rb +0 -457
- data/lib/zakuro/cycle/zodiac.rb +0 -103
- data/lib/zakuro/era/japan.rb +0 -660
- data/lib/zakuro/output/result.rb +0 -219
- data/lib/zakuro/version/senmyou/base/era.rb +0 -83
- data/lib/zakuro/version/senmyou/base/multi_gengou.rb +0 -98
- data/lib/zakuro/version/senmyou/base/multi_gengou_roller.rb +0 -205
- data/lib/zakuro/version/senmyou/base/remainder.rb +0 -60
- data/lib/zakuro/version/senmyou/base/solar_term.rb +0 -66
- data/lib/zakuro/version/senmyou/base/year.rb +0 -104
- data/lib/zakuro/version/senmyou/monthly/month.rb +0 -122
- data/lib/zakuro/version/senmyou/summary/annual_range.rb +0 -186
- data/lib/zakuro/version/senmyou/summary/full_range.rb +0 -216
- data/lib/zakuro/version/senmyou/summary/specifier.rb +0 -100
@@ -1,60 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../../cycle/abstract_remainder'
|
4
|
-
|
5
|
-
# :nodoc:
|
6
|
-
module Zakuro
|
7
|
-
# :nodoc:
|
8
|
-
module Senmyou
|
9
|
-
#
|
10
|
-
# Remainder 宣明暦の時刻情報(大余小余)
|
11
|
-
#
|
12
|
-
# * 「15日1835分5秒」のような形式で表される
|
13
|
-
# * 分は8400で一日に繰り上げる
|
14
|
-
# * 秒は基本的に1/8分で、8秒で1分に繰り上げる。ただし、月補正値は1分に100秒とするなど基数の変更がありえる
|
15
|
-
# * 十干十二支(60日)を上限とした「日時分秒」の情報で、日付(date)/時刻(time)と部分的に重なる概念
|
16
|
-
#
|
17
|
-
class Remainder < Cycle::AbstractRemainder
|
18
|
-
# @return [Integer] 統法(1日=8400分)
|
19
|
-
DAY = 8400
|
20
|
-
# @return [Integer] 分(1分=8秒)
|
21
|
-
MINUTE = 8
|
22
|
-
|
23
|
-
#
|
24
|
-
# 初期化
|
25
|
-
#
|
26
|
-
# @param [Integer] day 大余("日"に相当)
|
27
|
-
# @param [Integer] minute 小余("分"に相当)
|
28
|
-
# @param [Integer] second 秒
|
29
|
-
# @param [Integer] total 繰り上げなしの小余
|
30
|
-
#
|
31
|
-
def initialize(day: -1, minute: -1, second: -1, total: -1)
|
32
|
-
super(day: day, minute: minute, second: second, total: total,
|
33
|
-
base_day: DAY, base_mitune: MINUTE)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
#
|
38
|
-
# LunarRemainder 月の位相計算向け時刻情報(大余小余)
|
39
|
-
#
|
40
|
-
class LunarRemainder < Cycle::AbstractRemainder
|
41
|
-
# @return [Integer] 統法(1日=8400分)
|
42
|
-
DAY = 8400
|
43
|
-
# @return [Integer] 分(1分=100秒)
|
44
|
-
MINUTE = 100
|
45
|
-
|
46
|
-
#
|
47
|
-
# 初期化
|
48
|
-
#
|
49
|
-
# @param [Integer] day 大余("日"に相当)
|
50
|
-
# @param [Integer] minute 小余("分"に相当)
|
51
|
-
# @param [Integer] second 秒
|
52
|
-
# @param [Integer] total 繰り上げなしの小余
|
53
|
-
#
|
54
|
-
def initialize(day: -1, minute: -1, second: -1, total: -1)
|
55
|
-
super(day: day, minute: minute, second: second, total: total,
|
56
|
-
base_day: DAY, base_mitune: MINUTE)
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
@@ -1,66 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# :nodoc:
|
4
|
-
module Zakuro
|
5
|
-
# :nodoc:
|
6
|
-
module Senmyou
|
7
|
-
#
|
8
|
-
# SolarTerm 二十四節気
|
9
|
-
#
|
10
|
-
class SolarTerm
|
11
|
-
# @return [Integer] 連番
|
12
|
-
attr_reader :index
|
13
|
-
# @return [Remainder] 時刻情報(大余小余)
|
14
|
-
attr_reader :remainder
|
15
|
-
|
16
|
-
# @return [Hash<Integer, Symbol>] 順序
|
17
|
-
ORDER = {
|
18
|
-
0 => :touji,
|
19
|
-
1 => :shoukan,
|
20
|
-
2 => :daikan,
|
21
|
-
3 => :risshun,
|
22
|
-
4 => :usui,
|
23
|
-
5 => :keichitsu,
|
24
|
-
6 => :shunbun,
|
25
|
-
7 => :seimei,
|
26
|
-
8 => :kokuu,
|
27
|
-
9 => :rikka,
|
28
|
-
10 => :shouman,
|
29
|
-
11 => :boushu,
|
30
|
-
12 => :geshi,
|
31
|
-
13 => :shousho,
|
32
|
-
14 => :taisho,
|
33
|
-
15 => :risshuu,
|
34
|
-
16 => :shosho,
|
35
|
-
17 => :hakuro,
|
36
|
-
18 => :shuubun,
|
37
|
-
19 => :kanro,
|
38
|
-
20 => :soukou,
|
39
|
-
21 => :rittou,
|
40
|
-
22 => :shousetsu,
|
41
|
-
23 => :taisetsu
|
42
|
-
}.freeze
|
43
|
-
|
44
|
-
#
|
45
|
-
# 初期化
|
46
|
-
#
|
47
|
-
# @param [Integer] index 連番
|
48
|
-
# @param [Remainder] remainder 時刻情報(大余小余)
|
49
|
-
#
|
50
|
-
def initialize(index: -1, remainder: Remainder.new)
|
51
|
-
@index = index
|
52
|
-
@remainder = remainder
|
53
|
-
end
|
54
|
-
|
55
|
-
#
|
56
|
-
# 不正かどうか検証する
|
57
|
-
#
|
58
|
-
# @return [True] 正しくない
|
59
|
-
# @return [False] 正しい
|
60
|
-
#
|
61
|
-
def invalid?
|
62
|
-
(@index == -1 || @remainder.invalid?)
|
63
|
-
end
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
@@ -1,104 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative './era'
|
4
|
-
|
5
|
-
# :nodoc:
|
6
|
-
module Zakuro
|
7
|
-
# :nodoc:
|
8
|
-
module Senmyou
|
9
|
-
#
|
10
|
-
# Year 年
|
11
|
-
#
|
12
|
-
class Year
|
13
|
-
# @return [Gengou] 元号
|
14
|
-
attr_reader :multi_gengou
|
15
|
-
# @return [Array<Month>] 年内の全ての月
|
16
|
-
attr_reader :months
|
17
|
-
# @return [Integer] 年の日数
|
18
|
-
attr_reader :total_days
|
19
|
-
# @return [Western::Calendar] 元旦
|
20
|
-
attr_reader :new_year_date
|
21
|
-
|
22
|
-
#
|
23
|
-
# 初期化
|
24
|
-
#
|
25
|
-
# @param [Gengou] multi_gengou 元号
|
26
|
-
#
|
27
|
-
def initialize(multi_gengou: MultiGengou.new, new_year_date: Western::Calendar.new,
|
28
|
-
months: [], total_days: 0)
|
29
|
-
@multi_gengou = multi_gengou
|
30
|
-
@months = months
|
31
|
-
@new_year_date = new_year_date
|
32
|
-
@total_days = total_days
|
33
|
-
end
|
34
|
-
|
35
|
-
#
|
36
|
-
# 年の日数を確定する
|
37
|
-
#
|
38
|
-
def commit
|
39
|
-
@total_days = 0
|
40
|
-
months.each do |month|
|
41
|
-
@total_days += month.days
|
42
|
-
end
|
43
|
-
|
44
|
-
self
|
45
|
-
end
|
46
|
-
|
47
|
-
#
|
48
|
-
# 次年にする
|
49
|
-
#
|
50
|
-
# @param [Japan::Gengou] first_line 元号(1行目)
|
51
|
-
# @param [Japan::Gengou] second_line 元号(2行目)
|
52
|
-
#
|
53
|
-
# @return [MultiGengou] 自身
|
54
|
-
#
|
55
|
-
def next_year
|
56
|
-
@multi_gengou.next_year
|
57
|
-
|
58
|
-
@new_year_date += @total_days
|
59
|
-
@total_days = 0
|
60
|
-
|
61
|
-
self
|
62
|
-
end
|
63
|
-
|
64
|
-
#
|
65
|
-
# 十干十二支を取得する
|
66
|
-
#
|
67
|
-
# @return [String] 十干十二支
|
68
|
-
#
|
69
|
-
def zodiac_name
|
70
|
-
Era.zodiac_name(western_year: @new_year_date.year)
|
71
|
-
end
|
72
|
-
|
73
|
-
#
|
74
|
-
# 月を追加する
|
75
|
-
#
|
76
|
-
# @param [Month] month 月
|
77
|
-
#
|
78
|
-
def push(month:)
|
79
|
-
return if duplicated?(month: month)
|
80
|
-
|
81
|
-
@months.push(month)
|
82
|
-
|
83
|
-
nil
|
84
|
-
end
|
85
|
-
|
86
|
-
#
|
87
|
-
# すでに登録済みの月と重複しているか判定する
|
88
|
-
#
|
89
|
-
# @note 昨年11月1日から今年1月1日の前日までで、去年データと重複する場合は登録スキップする
|
90
|
-
#
|
91
|
-
# @param [Month] month 月
|
92
|
-
#
|
93
|
-
# @return [True] 重複している
|
94
|
-
# @return [True] 重複していない
|
95
|
-
#
|
96
|
-
def duplicated?(month:)
|
97
|
-
@months.each do |existed|
|
98
|
-
return true if existed.same?(other: month)
|
99
|
-
end
|
100
|
-
false
|
101
|
-
end
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
@@ -1,122 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
# :nodoc:
|
4
|
-
module Zakuro
|
5
|
-
# :nodoc:
|
6
|
-
module Senmyou
|
7
|
-
#
|
8
|
-
# Month 月情報
|
9
|
-
#
|
10
|
-
class Month
|
11
|
-
# @return [True] 昨年の月
|
12
|
-
# @return [False] 今年の月
|
13
|
-
# @note 冬至基準で1年データを作成するため昨年の11月-12月である可能性がある
|
14
|
-
attr_accessor :is_last_year
|
15
|
-
# @return [True] 大の月(30日)
|
16
|
-
# @return [False] 小の月(29日)
|
17
|
-
attr_accessor :is_many_days
|
18
|
-
# @return [Integer] 月(xx月のxx)
|
19
|
-
attr_accessor :number
|
20
|
-
# @return [True] 閏月
|
21
|
-
# @return [False] 平月
|
22
|
-
attr_accessor :leaped
|
23
|
-
# @return [SolarTerm] 二十四節気(中気)
|
24
|
-
attr_accessor :even_term
|
25
|
-
# @return [SolarTerm] 二十四節気(節気)
|
26
|
-
attr_accessor :odd_term
|
27
|
-
# @return [Remainder] 月初日の大余小余
|
28
|
-
attr_reader :remainder
|
29
|
-
# @return [String] 月齢(朔月、上弦、望月、下弦)
|
30
|
-
attr_reader :phase_index
|
31
|
-
|
32
|
-
# rubocop:disable Metrics/ParameterLists
|
33
|
-
# :reek:BooleanParametere
|
34
|
-
|
35
|
-
#
|
36
|
-
# 初期化
|
37
|
-
#
|
38
|
-
# @param [True, False] is_last_year 昨年の月/今年の月
|
39
|
-
# @param [Integer] number 月(xx月のxx)
|
40
|
-
# @param [True, False] is_many_days 大の月(30日)/小の月(29日)
|
41
|
-
# @param [True, False] leaped 閏月/平月
|
42
|
-
# @param [Remainder] remainder 月初日の大余小余
|
43
|
-
# @param [String] phase_index 月齢(朔月、上弦、望月、下弦)
|
44
|
-
# @param [SolarTerm] even_term 二十四節気(中気)
|
45
|
-
# @param [SolarTerm] odd_term 二十四節気(節気)
|
46
|
-
#
|
47
|
-
def initialize(is_last_year: -1, number: -1, is_many_days: false,
|
48
|
-
leaped: false, remainder: Remainder.new, phase_index: -1,
|
49
|
-
even_term: SolarTerm.new, odd_term: SolarTerm.new)
|
50
|
-
# 年
|
51
|
-
@is_last_year = is_last_year
|
52
|
-
# 月の大小
|
53
|
-
@is_many_days = is_many_days
|
54
|
-
# 月
|
55
|
-
@number = number
|
56
|
-
# 閏
|
57
|
-
@leaped = leaped
|
58
|
-
# 日
|
59
|
-
@remainder = remainder
|
60
|
-
# 月齢(朔月、上弦、望月、下弦)
|
61
|
-
@phase_index = phase_index
|
62
|
-
# 中気(二十四節気)
|
63
|
-
@even_term = even_term
|
64
|
-
# 節気(二十四節気)
|
65
|
-
@odd_term = odd_term
|
66
|
-
end
|
67
|
-
# rubocop:enable Metrics/ParameterLists
|
68
|
-
|
69
|
-
#
|
70
|
-
# 月の日数を返す
|
71
|
-
#
|
72
|
-
# @return [Integer] 日数
|
73
|
-
#
|
74
|
-
def days
|
75
|
-
@is_many_days ? 30 : 29
|
76
|
-
end
|
77
|
-
|
78
|
-
#
|
79
|
-
# 月の名前(大小)を返す
|
80
|
-
#
|
81
|
-
# @return [String] 月の名前(大小)
|
82
|
-
#
|
83
|
-
def days_name
|
84
|
-
@is_many_days ? '大' : '小'
|
85
|
-
end
|
86
|
-
|
87
|
-
#
|
88
|
-
# 同一の月情報かを検証する
|
89
|
-
#
|
90
|
-
# @param [Month] other 他の月情報
|
91
|
-
#
|
92
|
-
# @return [True] 同一の月
|
93
|
-
# @return [False] 異なる月
|
94
|
-
#
|
95
|
-
def same?(other:)
|
96
|
-
@number == other.number && @leaped == other.leaped
|
97
|
-
end
|
98
|
-
|
99
|
-
#
|
100
|
-
# 二十四節気が未設定かどうかを検証する
|
101
|
-
#
|
102
|
-
# @return [True] 設定なし
|
103
|
-
# @return [False] 設定あり
|
104
|
-
#
|
105
|
-
def empty_solar_term?
|
106
|
-
@even_term.invalid? && @odd_term.invalid?
|
107
|
-
end
|
108
|
-
|
109
|
-
#
|
110
|
-
# 文字化する
|
111
|
-
#
|
112
|
-
# @return [String] 文字
|
113
|
-
#
|
114
|
-
def to_s
|
115
|
-
"is_last_year: #{@is_last_year}, number: #{@number}, leaped: #{@leaped}, " \
|
116
|
-
"remainder: #{@remainder.format}, phase_index: #{@phase_index}, " \
|
117
|
-
"even_term: #{@even_term.remainder.format}: #{@even_term.index}, " \
|
118
|
-
"odd_term: #{@odd_term.remainder.format}: #{@odd_term.index}"
|
119
|
-
end
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
@@ -1,186 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative '../../../output/logger'
|
4
|
-
require_relative '../base/remainder'
|
5
|
-
require_relative '../monthly/month'
|
6
|
-
require_relative '../base/solar_term'
|
7
|
-
require_relative '../monthly/lunar_phase'
|
8
|
-
require_relative '../stella/solar_orbit'
|
9
|
-
require_relative '../stella/solar_average'
|
10
|
-
require_relative '../stella/lunar_orbit'
|
11
|
-
|
12
|
-
# :nodoc:
|
13
|
-
module Zakuro
|
14
|
-
# :nodoc:
|
15
|
-
module Senmyou
|
16
|
-
# AnnualRange 年間データ
|
17
|
-
module AnnualRange
|
18
|
-
# @return [Logger] ロガー
|
19
|
-
LOGGER = Logger.new(location: 'annual_range')
|
20
|
-
|
21
|
-
# :reek:TooManyStatements { max_statements: 6 }
|
22
|
-
|
23
|
-
#
|
24
|
-
# 11月定朔(冬至が含まれる月の1日:補正済)を求める
|
25
|
-
#
|
26
|
-
# @param [Integer] western_year 西暦年
|
27
|
-
#
|
28
|
-
# @return [Remainder] 11月定朔
|
29
|
-
#
|
30
|
-
def self.calc_last_november_1st(western_year:)
|
31
|
-
# 天正閏余
|
32
|
-
winter_solstice_age = \
|
33
|
-
WinterSolstice.calc_moon_age(western_year: western_year)
|
34
|
-
# 11月経朔
|
35
|
-
november_1st = \
|
36
|
-
WinterSolstice.calc_averaged_last_november_1st(western_year: western_year)
|
37
|
-
# 11月定朔
|
38
|
-
|
39
|
-
# 補正
|
40
|
-
correction_value = correction_value_on_last_november_1st(
|
41
|
-
winter_solstice_age: winter_solstice_age,
|
42
|
-
western_year: western_year
|
43
|
-
)
|
44
|
-
|
45
|
-
result = november_1st.add(Remainder.new(day: 0, minute: correction_value,
|
46
|
-
second: 0))
|
47
|
-
# 進朔
|
48
|
-
result.up_on_new_moon!
|
49
|
-
result
|
50
|
-
end
|
51
|
-
|
52
|
-
# :reek:TooManyStatements { max_statements: 6 }
|
53
|
-
|
54
|
-
#
|
55
|
-
# 一覧取得する
|
56
|
-
#
|
57
|
-
# * 対象年に対して、前年11月-当年11月までを出力する
|
58
|
-
# * 対象年(西暦)と計算年(元号x年)の紐付けは行わない
|
59
|
-
#
|
60
|
-
# @param [Integer] western_year 西暦年
|
61
|
-
#
|
62
|
-
# @return [Array<Month>] 1年データ
|
63
|
-
#
|
64
|
-
def self.collect_annual_range_after_last_november_1st(western_year:)
|
65
|
-
annual_range = initialized_annual_range(western_year: western_year)
|
66
|
-
|
67
|
-
apply_big_and_small_of_the_month(annual_range: annual_range)
|
68
|
-
|
69
|
-
SolarAverage.set_solar_terms_into_annual_range(western_year: western_year,
|
70
|
-
annual_range: annual_range)
|
71
|
-
|
72
|
-
# 月間隔を取得するためだけの末尾要素を削除
|
73
|
-
annual_range.pop
|
74
|
-
|
75
|
-
adjust_leap_month(annual_range: annual_range)
|
76
|
-
|
77
|
-
annual_range
|
78
|
-
end
|
79
|
-
|
80
|
-
#
|
81
|
-
# 11月定朔の補正値を求める
|
82
|
-
#
|
83
|
-
# @param [Remainder] winter_solstice_age 天正閏余
|
84
|
-
# @param [Integer] western_year 西暦年
|
85
|
-
#
|
86
|
-
# @return [Integer] 補正値
|
87
|
-
#
|
88
|
-
def self.correction_value_on_last_november_1st(winter_solstice_age:, western_year:)
|
89
|
-
# 補正
|
90
|
-
solar_term = SolarTerm.new(
|
91
|
-
remainder: winter_solstice_age
|
92
|
-
)
|
93
|
-
solar_term = \
|
94
|
-
SolarOrbit.calc_solar_term_by_remainder(
|
95
|
-
solar_term: solar_term
|
96
|
-
)
|
97
|
-
|
98
|
-
moon_remainder, is_forward = LunarOrbit.calc_moon_point(
|
99
|
-
remainder: winter_solstice_age, western_year: western_year
|
100
|
-
)
|
101
|
-
|
102
|
-
SolarOrbit.calc_sun_orbit_value(solar_term: solar_term) +
|
103
|
-
LunarOrbit.calc_moon_orbit_value(remainder_month: moon_remainder,
|
104
|
-
is_forward: is_forward)
|
105
|
-
end
|
106
|
-
private_class_method :correction_value_on_last_november_1st
|
107
|
-
|
108
|
-
#
|
109
|
-
# 1年データを取得する
|
110
|
-
#
|
111
|
-
# @param [Integer] western_year 西暦年
|
112
|
-
#
|
113
|
-
# @return [Array<Month>] 1年データ
|
114
|
-
#
|
115
|
-
def self.initialized_annual_range(western_year:)
|
116
|
-
result = []
|
117
|
-
lunar_phase = LunarPhase.new(western_year: western_year)
|
118
|
-
|
119
|
-
is_last_year = true
|
120
|
-
|
121
|
-
monthes = [11, 12] + [*1..12]
|
122
|
-
|
123
|
-
monthes.each do |month|
|
124
|
-
LOGGER.debug('---', "month: #{month}", "is_last_year: #{is_last_year}")
|
125
|
-
|
126
|
-
adjusted = lunar_phase.next_month
|
127
|
-
|
128
|
-
result.push(
|
129
|
-
Month.new(is_last_year: is_last_year, number: month,
|
130
|
-
remainder: adjusted, phase_index: 0)
|
131
|
-
)
|
132
|
-
is_last_year = false if month == 12
|
133
|
-
end
|
134
|
-
result
|
135
|
-
end
|
136
|
-
private_class_method :initialized_annual_range
|
137
|
-
|
138
|
-
#
|
139
|
-
# 1年データの各月に月の大小を設定する
|
140
|
-
#
|
141
|
-
# @param [Array<Month>] annual_range 1年データ
|
142
|
-
#
|
143
|
-
def self.apply_big_and_small_of_the_month(annual_range:)
|
144
|
-
size = annual_range.size - 1
|
145
|
-
(0...size).each do |idx|
|
146
|
-
current_month = annual_range[idx]
|
147
|
-
next_month = annual_range[idx + 1]
|
148
|
-
current_month.is_many_days = \
|
149
|
-
current_month.remainder.same_remainder_divided_by_ten?(
|
150
|
-
other: next_month.remainder.day
|
151
|
-
)
|
152
|
-
end
|
153
|
-
end
|
154
|
-
private_class_method :apply_big_and_small_of_the_month
|
155
|
-
|
156
|
-
# :reek:TooManyStatements { max_statements: 10 }
|
157
|
-
|
158
|
-
#
|
159
|
-
# 閏月が存在した場合に以降の月を1つずつ減らす
|
160
|
-
# @example 7,8,9 と続く月の8月が閏の場合、7, 閏7, 8 となる
|
161
|
-
#
|
162
|
-
# @param [Array<Month>] annual_range 1年データ
|
163
|
-
#
|
164
|
-
def self.adjust_leap_month(annual_range:)
|
165
|
-
# 閏による月の再調整を行う
|
166
|
-
leaped = false
|
167
|
-
annual_range.each do |month|
|
168
|
-
if month.even_term.invalid?
|
169
|
-
month.leaped = true
|
170
|
-
leaped = true
|
171
|
-
end
|
172
|
-
next unless leaped
|
173
|
-
|
174
|
-
# NOTE: 常気法では閏月は2-3年に一度のため、1年に二度発生しない前提
|
175
|
-
number = month.number - 1
|
176
|
-
if number <= 0
|
177
|
-
month.is_last_year = true
|
178
|
-
number = 12
|
179
|
-
end
|
180
|
-
month.number = number
|
181
|
-
end
|
182
|
-
end
|
183
|
-
private_class_method :adjust_leap_month
|
184
|
-
end
|
185
|
-
end
|
186
|
-
end
|