zakuro 0.2.0 → 0.3.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/cycle/abstract_remainder.rb +33 -20
- data/lib/zakuro/calculation/stella/lunar/abstract_location.rb +9 -7
- data/lib/zakuro/calculation/stella/lunar/choukei_value.rb +19 -0
- data/lib/zakuro/era/japan/reki.rb +1 -1
- data/lib/zakuro/version.rb +1 -1
- data/lib/zakuro/version/context.rb +1 -1
- data/lib/zakuro/version/daien/const/number.rb +55 -0
- data/lib/zakuro/version/daien/const/remainder.rb +53 -0
- data/lib/zakuro/version/daien/cycle/remainder.rb +59 -0
- data/lib/zakuro/version/daien/cycle/solar_term.rb +34 -0
- data/lib/zakuro/version/daien/daien.rb +36 -0
- data/lib/zakuro/version/daien/monthly/lunar_phase.rb +106 -0
- data/lib/zakuro/version/daien/range/annual_range.rb +39 -0
- data/lib/zakuro/version/daien/stella/lunar/adjustment.rb +240 -0
- data/lib/zakuro/version/daien/stella/lunar/localization.rb +44 -0
- data/lib/zakuro/version/daien/stella/lunar/location.rb +80 -0
- data/lib/zakuro/version/daien/stella/lunar/value.rb +75 -0
- data/lib/zakuro/version/daien/stella/origin/average_november.rb +34 -0
- data/lib/zakuro/version/daien/stella/origin/lunar_age.rb +62 -0
- data/lib/zakuro/version/daien/stella/origin/winter_solstice.rb +55 -0
- data/lib/zakuro/version/daien/stella/solar/adjustment.rb +93 -0
- data/lib/zakuro/version/daien/stella/solar/average.rb +98 -0
- data/lib/zakuro/version/daien/stella/solar/interval.rb +108 -0
- data/lib/zakuro/version/daien/stella/solar/location.rb +61 -0
- data/lib/zakuro/version/daien/stella/solar/value.rb +36 -0
- data/lib/zakuro/version/gihou/const/remainder.rb +0 -2
- data/lib/zakuro/version/gihou/cycle/remainder.rb +1 -6
- data/lib/zakuro/version/gihou/monthly/lunar_phase.rb +1 -1
- data/lib/zakuro/version/gihou/stella/lunar/location.rb +2 -8
- data/lib/zakuro/version/gihou/stella/lunar/value.rb +3 -2
- data/lib/zakuro/version/gihou/stella/solar/average.rb +1 -1
- data/lib/zakuro/version/senmyou/const/remainder.rb +0 -2
- data/lib/zakuro/version/senmyou/cycle/remainder.rb +1 -6
- data/lib/zakuro/version/senmyou/monthly/lunar_phase.rb +1 -1
- data/lib/zakuro/version/senmyou/stella/lunar/location.rb +2 -8
- data/lib/zakuro/version/senmyou/stella/lunar/value.rb +3 -2
- data/lib/zakuro/version/senmyou/stella/solar/average.rb +1 -1
- data/lib/zakuro/version/version_class_resolver.rb +4 -0
- data/lib/zakuro/version_factory.rb +1 -1
- metadata +25 -7
- data/lib/zakuro/version/taien/taien.rb +0 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 73a145098928102269c600528b1552422d174c88a14baa83f8cc426deaa2ee43
|
4
|
+
data.tar.gz: 55d493cccce632e6d654394bee779be3756a628cf747d6c064583cc8c244ab55
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9df9ca681cf42f72b574b888123d40a2368218c9077f7c03415ec4e50219489d16b8e5f285c1c17cdad3f88bae1c8ea460920c2469c17f381adf4bc54d654033
|
7
|
+
data.tar.gz: 8eb61f2f32029e649f2faf75e3d4592daf9c2b2da82216143f5586712f0d1fe50088677bed35e980a3e2ddf2a1be3712f101c4486dfa32261efd3ce5da9bf4d7
|
@@ -10,6 +10,11 @@ module Zakuro
|
|
10
10
|
# 大余小余(時刻情報)
|
11
11
|
# @abstract 大余小余計算に必要な処理を行う、暦に依存しない汎用的なクラス
|
12
12
|
#
|
13
|
+
# * 十干十二支(60日)を上限とした「日時分秒」の情報で、日付(date)/時刻(time)と部分的に重なる概念
|
14
|
+
# * 「15日1012分5秒」のような形式で表される
|
15
|
+
# * 分の上限で大余に繰り上げる
|
16
|
+
# * 秒の上限で1分に繰り上げる
|
17
|
+
#
|
13
18
|
class AbstractRemainder # rubocop:disable Metrics/ClassLength
|
14
19
|
# @return [Integer] 大余上限
|
15
20
|
LIMIT = 60
|
@@ -224,8 +229,7 @@ module Zakuro
|
|
224
229
|
# @return [False] より小さい
|
225
230
|
#
|
226
231
|
def >=(other)
|
227
|
-
up?(other) ||
|
228
|
-
(@day == other.day && @minute == other.minute && @second == other.second)
|
232
|
+
up?(other) || eql?(other)
|
229
233
|
end
|
230
234
|
|
231
235
|
#
|
@@ -249,8 +253,7 @@ module Zakuro
|
|
249
253
|
# @return [False] より大きい
|
250
254
|
#
|
251
255
|
def <=(other)
|
252
|
-
down?(other) ||
|
253
|
-
(@day == other.day && @minute == other.minute && @second == other.second)
|
256
|
+
down?(other) || eql?(other)
|
254
257
|
end
|
255
258
|
|
256
259
|
#
|
@@ -339,10 +342,19 @@ module Zakuro
|
|
339
342
|
# @return [Integer] 小余(秒切り捨て)
|
340
343
|
#
|
341
344
|
def floor_minute
|
342
|
-
result =
|
345
|
+
result = float_minute
|
343
346
|
result.floor
|
344
347
|
end
|
345
348
|
|
349
|
+
#
|
350
|
+
# 秒を含めた小余を返す
|
351
|
+
#
|
352
|
+
# @return [Float] 小余
|
353
|
+
#
|
354
|
+
def float_minute
|
355
|
+
@minute + @second.to_f / @base_minute
|
356
|
+
end
|
357
|
+
|
346
358
|
#
|
347
359
|
# 大余に四捨五入した結果を返す(秒は除外する)
|
348
360
|
#
|
@@ -377,14 +389,19 @@ module Zakuro
|
|
377
389
|
super(form, @day, @minute, @second)
|
378
390
|
end
|
379
391
|
|
380
|
-
|
381
|
-
|
382
|
-
|
383
|
-
|
392
|
+
#
|
393
|
+
# 繰り上げる
|
394
|
+
#
|
395
|
+
# @return [AbstractRemainder] 繰り上げ結果
|
396
|
+
#
|
397
|
+
def carry!
|
398
|
+
@day, @minute, @second = carry(@day, @minute, @second)
|
384
399
|
|
385
400
|
self
|
386
401
|
end
|
387
402
|
|
403
|
+
private
|
404
|
+
|
388
405
|
# 繰り上げ、繰り下げ
|
389
406
|
def carry(param_day, param_minute, param_second)
|
390
407
|
# NOTE: 計算方法としてマイナスでも徐算・剰余算の結果をプラス同様に扱う
|
@@ -437,33 +454,29 @@ module Zakuro
|
|
437
454
|
def up?(other)
|
438
455
|
invalid?(param: other)
|
439
456
|
day = other.day
|
440
|
-
minute = other.
|
457
|
+
minute = other.float_minute
|
458
|
+
|
441
459
|
return true if @day > day
|
442
460
|
return false if @day < day
|
443
461
|
|
444
|
-
|
445
|
-
return false if @minute < minute
|
446
|
-
|
447
|
-
@second > other.second
|
462
|
+
float_minute > minute
|
448
463
|
end
|
449
464
|
|
450
465
|
def eql?(other)
|
451
466
|
invalid?(param: other)
|
452
467
|
|
453
|
-
(@day == other.day &&
|
468
|
+
(@day == other.day && float_minute == other.float_minute)
|
454
469
|
end
|
455
470
|
|
456
471
|
def down?(other)
|
457
472
|
invalid?(param: other)
|
458
473
|
day = other.day
|
459
|
-
minute = other.
|
474
|
+
minute = other.float_minute
|
475
|
+
|
460
476
|
return true if @day < day
|
461
477
|
return false if @day > day
|
462
478
|
|
463
|
-
|
464
|
-
return false if @minute > minute
|
465
|
-
|
466
|
-
@second < other.second
|
479
|
+
float_minute < minute
|
467
480
|
end
|
468
481
|
end
|
469
482
|
end
|
@@ -46,6 +46,15 @@ module Zakuro
|
|
46
46
|
# abstract
|
47
47
|
end
|
48
48
|
|
49
|
+
#
|
50
|
+
# 1始まりの大余小余を取得する
|
51
|
+
#
|
52
|
+
# @return [Cycle::AbstractRemainder] 1始まりの大余小余
|
53
|
+
#
|
54
|
+
def adjusted_remainder
|
55
|
+
@remainder.add(Cycle::AbstractRemainder.new(day: 1, minute: 0, second: 0))
|
56
|
+
end
|
57
|
+
|
49
58
|
private
|
50
59
|
|
51
60
|
#
|
@@ -63,13 +72,6 @@ module Zakuro
|
|
63
72
|
def decrease(limit:)
|
64
73
|
# abstract
|
65
74
|
end
|
66
|
-
|
67
|
-
#
|
68
|
-
# 1始まりにする
|
69
|
-
#
|
70
|
-
def one_based
|
71
|
-
@remainder.add!(Cycle::AbstractRemainder.new(day: 1, minute: 0, second: 0))
|
72
|
-
end
|
73
75
|
end
|
74
76
|
end
|
75
77
|
end
|
@@ -30,6 +30,25 @@ module Zakuro
|
|
30
30
|
day
|
31
31
|
end
|
32
32
|
|
33
|
+
#
|
34
|
+
# 秒がない大余小余にする
|
35
|
+
#
|
36
|
+
# @param [Cycle::LunarRemainder] remainder 大余小余
|
37
|
+
#
|
38
|
+
# @note 815年で大余繰り上げあり
|
39
|
+
#
|
40
|
+
# @return [Integer] 大余
|
41
|
+
# @return [Float] 小余
|
42
|
+
#
|
43
|
+
def self.remainder_without_second(remainder:)
|
44
|
+
adjusted = remainder.class.new(
|
45
|
+
day: remainder.day, minute: remainder.floor_minute, second: 0
|
46
|
+
)
|
47
|
+
adjusted.carry!
|
48
|
+
|
49
|
+
[adjusted.day, adjusted.minute]
|
50
|
+
end
|
51
|
+
|
33
52
|
def self.day_only(remainder_minute:, denominator:)
|
34
53
|
float_day = Type::OldFloat.new(remainder_minute / denominator)
|
35
54
|
# 切り捨て(プラスマイナスに関わらず小数点以下切り捨て)
|
@@ -44,7 +44,7 @@ module Zakuro
|
|
44
44
|
start_date: Western::Calendar.new(year: 698, month: 2, day: 16)
|
45
45
|
),
|
46
46
|
Range.new(
|
47
|
-
class_name: 'Zakuro::
|
47
|
+
class_name: 'Zakuro::Daien::Gateway',
|
48
48
|
start_date: Western::Calendar.new(year: 764, month: 2, day: 7)
|
49
49
|
),
|
50
50
|
Range.new(
|
data/lib/zakuro/version.rb
CHANGED
@@ -11,7 +11,7 @@ module Zakuro
|
|
11
11
|
attr_reader :version_name
|
12
12
|
attr_reader :resolver
|
13
13
|
|
14
|
-
VERSION_NAMES = %w[Genka Gihou
|
14
|
+
VERSION_NAMES = %w[Genka Gihou Daien Senmyou Joukyou Kansei Tenpou Gregorio].freeze
|
15
15
|
|
16
16
|
def initialize(version_name:)
|
17
17
|
raise ArgumentError.new, 'invalid version' unless VERSION_NAMES.include?(version_name)
|
@@ -0,0 +1,55 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# :nodoc:
|
4
|
+
module Zakuro
|
5
|
+
# :nodoc:
|
6
|
+
module Daien
|
7
|
+
#
|
8
|
+
# Const 定数
|
9
|
+
#
|
10
|
+
module Const
|
11
|
+
#
|
12
|
+
# Number 数値
|
13
|
+
#
|
14
|
+
module Number
|
15
|
+
#
|
16
|
+
# Cycle 周期
|
17
|
+
#
|
18
|
+
module Cycle
|
19
|
+
# @return [Integer] 通法(1日=3040分)
|
20
|
+
DAY = 3040
|
21
|
+
#
|
22
|
+
# @return [Float] 転日(1近点月 = 27日1685分79秒(1分=80秒))
|
23
|
+
# @note 小数点以下の値によって大幅に結果が変わる。除算結果を設定した
|
24
|
+
#
|
25
|
+
ANOMALISTIC_MONTH = 83_765 + (79.0 / 80)
|
26
|
+
# @return [Integer] 朔望月
|
27
|
+
SYNODIC_MONTH = 89_773
|
28
|
+
# @return [Integer] 一年
|
29
|
+
YEAR = 1_110_343
|
30
|
+
end
|
31
|
+
|
32
|
+
#
|
33
|
+
# Derivation 導出
|
34
|
+
#
|
35
|
+
module Derivation
|
36
|
+
# @return [Integer] 通余: (YEAR - DAY * 12 * 30)
|
37
|
+
# 1110343 - 1094400
|
38
|
+
REMAINDER_ALL_YEAR = 15_943
|
39
|
+
# @return [Integer] 旬周(60日) DAY * 60
|
40
|
+
SIXTY_DAYS = 182_400
|
41
|
+
end
|
42
|
+
|
43
|
+
#
|
44
|
+
# 累積
|
45
|
+
#
|
46
|
+
module Stack
|
47
|
+
# @return [Integer] 積年(甲子夜半朔旦冬至〜暦の開始前)
|
48
|
+
TOTAL_YEAR = 96_961_740
|
49
|
+
# @return [Integer] 暦の開始年(開元12年)
|
50
|
+
BEGIN_YEAR = 724
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../cycle/remainder'
|
4
|
+
|
5
|
+
# :nodoc:
|
6
|
+
module Zakuro
|
7
|
+
# :nodoc:
|
8
|
+
module Daien
|
9
|
+
#
|
10
|
+
# Const 定数
|
11
|
+
#
|
12
|
+
module Const
|
13
|
+
#
|
14
|
+
# Remainder 大余小余
|
15
|
+
#
|
16
|
+
module Remainder
|
17
|
+
#
|
18
|
+
# Solar 太陽
|
19
|
+
#
|
20
|
+
module Solar
|
21
|
+
# @return [Remainder] 気策(24分の1年)
|
22
|
+
# 1年(1_110_343) / 24 / 1日(3040)= 15 余り 664.2916666666642
|
23
|
+
# * 0.2916666666642 * 24(1分=24秒) = 6.999999999940799 ≒ 7
|
24
|
+
SOLAR_TERM_AVERAGE = Cycle::Remainder.new(day: 15, minute: 664, second: 7)
|
25
|
+
#
|
26
|
+
# @note 揲法 89773 = 29-1613
|
27
|
+
# * 89773 / 4 = 22443.25 / 3040 = 7 余り 1163.25
|
28
|
+
# * 0.25 * 24(1分=24秒) = 6
|
29
|
+
#
|
30
|
+
# @return [Cycle::Remainder] 弦(1分=80秒)
|
31
|
+
QUARTER = Cycle::Remainder.new(day: 7, minute: 1163, second: 6)
|
32
|
+
end
|
33
|
+
|
34
|
+
#
|
35
|
+
# Lunar 月
|
36
|
+
#
|
37
|
+
module Lunar
|
38
|
+
# @return [Cycle::LunarRemainder] 転日(1近点月)
|
39
|
+
ANOMALISTIC_MONTH = \
|
40
|
+
Cycle::LunarRemainder.new(day: 27, minute: 1685, second: 79)
|
41
|
+
#
|
42
|
+
# @note 揲法 89773 = 29-1613
|
43
|
+
# * 89773 / 4 = 22443.25 / 3040 = 7 余り 1163.25
|
44
|
+
# * 0.25 * 80(1分=80秒) = 20
|
45
|
+
#
|
46
|
+
# @return [Cycle::LunarRemainder] 弦(1分=80秒)
|
47
|
+
# TODO: 秒が20では通らない。少なくとも0.01247は必要になる
|
48
|
+
QUARTER = Cycle::LunarRemainder.new(day: 7, minute: 1163, second: 20.01247)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../calculation/cycle/abstract_remainder'
|
4
|
+
|
5
|
+
require_relative '../const/number'
|
6
|
+
|
7
|
+
# :nodoc:
|
8
|
+
module Zakuro
|
9
|
+
# :nodoc:
|
10
|
+
module Daien
|
11
|
+
# :nodoc:
|
12
|
+
module Cycle
|
13
|
+
#
|
14
|
+
# Remainder 時刻情報(大余小余)
|
15
|
+
#
|
16
|
+
class Remainder < Calculation::Cycle::AbstractRemainder
|
17
|
+
# 『歴代天文律暦等志彙編 七』中華書房 p.2056
|
18
|
+
# 「象統;二十四」「其秒盈象統,従小餘」
|
19
|
+
# 上記は舊唐志の記述だが、新唐志(p.2218)でも同様であることを確認した
|
20
|
+
# @return [Integer] 分(1分=24秒)
|
21
|
+
MINUTE = 24
|
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(base_day: Const::Number::Cycle::DAY, base_mitune: MINUTE,
|
33
|
+
day: day, minute: minute, second: second, total: total)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# LunarRemainder 月の位相計算向け時刻情報(大余小余)
|
39
|
+
#
|
40
|
+
class LunarRemainder < Calculation::Cycle::AbstractRemainder
|
41
|
+
# @return [Integer] 分(1分=80秒)
|
42
|
+
MINUTE = 80
|
43
|
+
|
44
|
+
#
|
45
|
+
# 初期化
|
46
|
+
#
|
47
|
+
# @param [Integer] day 大余("日"に相当)
|
48
|
+
# @param [Integer] minute 小余("分"に相当)
|
49
|
+
# @param [Integer] second 秒
|
50
|
+
# @param [Integer] total 繰り上げなしの小余
|
51
|
+
#
|
52
|
+
def initialize(day: -1, minute: -1, second: -1, total: -1)
|
53
|
+
super(base_day: Const::Number::Cycle::DAY, base_mitune: MINUTE,
|
54
|
+
day: day, minute: minute, second: second, total: total)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../../../calculation/cycle/abstract_solar_term'
|
4
|
+
|
5
|
+
require_relative '../const/remainder'
|
6
|
+
|
7
|
+
require_relative './remainder'
|
8
|
+
|
9
|
+
# :nodoc:
|
10
|
+
module Zakuro
|
11
|
+
# :nodoc:
|
12
|
+
module Daien
|
13
|
+
# :nodoc:
|
14
|
+
module Cycle
|
15
|
+
#
|
16
|
+
# SolarTerm 二十四節気
|
17
|
+
#
|
18
|
+
class SolarTerm < Calculation::Cycle::AbstractSolarTerm
|
19
|
+
# @return [Remainder] 気策(24分の1年)
|
20
|
+
SOLAR_TERM_AVERAGE = Const::Remainder::Solar::SOLAR_TERM_AVERAGE
|
21
|
+
|
22
|
+
#
|
23
|
+
# 初期化
|
24
|
+
#
|
25
|
+
# @param [Integer] index 連番
|
26
|
+
# @param [Remainder] remainder 時刻情報(大余小余)
|
27
|
+
#
|
28
|
+
def initialize(index: -1, remainder: Remainder.new)
|
29
|
+
super(index: index, remainder: remainder, average: SOLAR_TERM_AVERAGE)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative '../abstract_version'
|
4
|
+
|
5
|
+
# :nodoc:
|
6
|
+
module Zakuro
|
7
|
+
#
|
8
|
+
# Daien 大衍暦
|
9
|
+
#
|
10
|
+
module Daien
|
11
|
+
#
|
12
|
+
# Gateway アクセサメソッド群
|
13
|
+
#
|
14
|
+
class Gateway < AbstractVersion
|
15
|
+
# @return [True] リリースあり
|
16
|
+
RELEASE = true
|
17
|
+
|
18
|
+
# @return [String] 暦クラス名
|
19
|
+
VERSION_NAME = 'Daien'
|
20
|
+
|
21
|
+
#
|
22
|
+
# 西暦日から和暦日に変換する
|
23
|
+
#
|
24
|
+
# @param [Date] western_date 西暦日
|
25
|
+
#
|
26
|
+
# @return [Result::Single] 和暦日
|
27
|
+
#
|
28
|
+
def self.to_japan_date(western_date:)
|
29
|
+
date = Western::Calendar.create(date: western_date)
|
30
|
+
|
31
|
+
context = Context.new(version_name: VERSION_NAME)
|
32
|
+
Calculation::Summary::Single.get(context: context, date: date)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|