when_exe 0.3.8 → 0.3.9
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/README.md +210 -210
- data/lib/when_exe.rb +923 -919
- data/lib/when_exe/basictypes.rb +1 -1
- data/lib/when_exe/calendartypes.rb +4 -4
- data/lib/when_exe/coordinates.rb +5 -1
- data/lib/when_exe/ephemeris.rb +1 -1
- data/lib/when_exe/locales/locale.rb +3 -2
- data/lib/when_exe/region/bahai.rb +2 -2
- data/lib/when_exe/region/chinese.rb +1030 -1030
- data/lib/when_exe/region/chinese/epochs.rb +887 -919
- data/lib/when_exe/region/discordian.rb +5 -5
- data/lib/when_exe/region/east_asian.rb +256 -0
- data/lib/when_exe/region/french.rb +1 -1
- data/lib/when_exe/region/indian.rb +7 -7
- data/lib/when_exe/region/international_fixed.rb +2 -2
- data/lib/when_exe/region/iranian.rb +1 -1
- data/lib/when_exe/region/islamic.rb +102 -103
- data/lib/when_exe/region/japanese/epochs.rb +426 -426
- data/lib/when_exe/region/japanese/nihon_shoki.rb +46 -47
- data/lib/when_exe/region/japanese/notes.rb +1482 -1482
- data/lib/when_exe/region/japanese/twins.rb +3 -3
- data/lib/when_exe/region/japanese/weeks.rb +2 -2
- data/lib/when_exe/region/jewish.rb +5 -0
- data/lib/when_exe/region/korean.rb +209 -203
- data/lib/when_exe/region/positivist.rb +2 -2
- data/lib/when_exe/region/roman.rb +1 -1
- data/lib/when_exe/region/ryukyu.rb +50 -48
- data/lib/when_exe/region/shire.rb +2 -2
- data/lib/when_exe/region/thai.rb +1 -1
- data/lib/when_exe/region/tibetan.rb +15 -15
- data/lib/when_exe/region/tranquility.rb +2 -2
- data/lib/when_exe/region/vietnamese.rb +167 -167
- data/lib/when_exe/region/world.rb +3 -3
- data/lib/when_exe/region/world_season.rb +2 -2
- data/lib/when_exe/region/yerm.rb +4 -2
- data/lib/when_exe/region/zoroastrian.rb +1 -1
- data/lib/when_exe/tmreference.rb +140 -128
- data/lib/when_exe/version.rb +1 -1
- data/test/examples/Spatial.m17n +3 -3
- data/test/test.rb +2 -1
- data/test/test/coordinates.rb +2 -2
- data/test/test/region/chinese.rb +2 -2
- data/test/test/region/islamic.rb +38 -2
- data/test/test/region/japanese.rb +2 -2
- data/test/test/region/vietnamese.rb +2 -2
- data/test/test/region/yerm.rb +156 -146
- metadata +3 -3
- data/lib/when_exe/region/far_east.rb +0 -188
@@ -13,10 +13,9 @@ class When::TM::CalendarEra
|
|
13
13
|
NihonKoki = [self, [
|
14
14
|
"locale:[=ja:, en=en:, alias]",
|
15
15
|
"area:[日本]",
|
16
|
-
["[
|
17
|
-
["[
|
18
|
-
["[
|
19
|
-
["[皇紀]2533", "@CR", "1873-01-01^Gregorian"]
|
16
|
+
["[皇紀=ja:%%<神武天皇即位紀元>]1", "@A", "-659-01-01^JapaneseTwin::平朔儀鳳暦"],
|
17
|
+
["[皇紀=ja:%%<神武天皇即位紀元>]1114", "@CR", "0454-01-01^Japanese"],
|
18
|
+
["[皇紀=ja:%%<神武天皇即位紀元>]2533", "@CR", "1873-01-01^Gregorian"]
|
20
19
|
]]
|
21
20
|
|
22
21
|
#
|
@@ -24,48 +23,48 @@ class When::TM::CalendarEra
|
|
24
23
|
#
|
25
24
|
NihonShoki = [self, [
|
26
25
|
"locale:[=ja:, en=en:, alias]",
|
27
|
-
"period:[(日本書紀)=ja:%%<日本書紀>, (Nihon_Shoki)=en:Nihon_Shoki]",
|
28
|
-
["[
|
29
|
-
["[
|
30
|
-
["[
|
31
|
-
["[
|
32
|
-
["[
|
33
|
-
["[
|
34
|
-
["[
|
35
|
-
["[
|
36
|
-
["[
|
37
|
-
["[
|
38
|
-
["[
|
39
|
-
["[
|
40
|
-
["[
|
41
|
-
["[
|
42
|
-
["[
|
43
|
-
["[
|
44
|
-
["[
|
45
|
-
["[
|
46
|
-
["[
|
47
|
-
["[
|
48
|
-
["[
|
49
|
-
["[
|
50
|
-
["[
|
51
|
-
["[
|
52
|
-
["[
|
53
|
-
["[
|
54
|
-
["[
|
55
|
-
["[
|
56
|
-
["[
|
57
|
-
["[
|
58
|
-
["[
|
59
|
-
["[
|
60
|
-
["[
|
61
|
-
["[
|
62
|
-
["[
|
63
|
-
["[
|
64
|
-
["[大化]1",
|
65
|
-
["[白雉]1",
|
66
|
-
["[
|
67
|
-
["[
|
68
|
-
["[
|
69
|
-
["[朱鳥]1",
|
26
|
+
"period:[日本(日本書紀)=ja:%%<日本書紀>, (Nihon_Shoki)=en:Nihon_Shoki]",
|
27
|
+
["[<神武>=ja:%%<神武天皇>]1", "@A", "name=[神武=ja:%%<神武天皇>];-659-01-01^JapaneseTwin::平朔儀鳳暦"],
|
28
|
+
["[<綏靖>=ja:%%<綏靖天皇>]1", "@A", "name=[綏靖=ja:%%<綏靖天皇>];-580-01-08"],
|
29
|
+
["[<安寧>=ja:%%<安寧天皇>]0", "@A", "name=[安寧=ja:%%<安寧天皇>];-548-07-03"],
|
30
|
+
["[<懿徳>=ja:%%<懿徳天皇>]1", "@A", "name=[懿徳=ja:%%<懿徳天皇>];-509-02-04"],
|
31
|
+
["[<孝昭>=ja:%%<孝昭天皇>]1", "@A", "name=[孝昭=ja:%%<孝昭天皇>];-474-01-09"],
|
32
|
+
["[<孝安>=ja:%%<孝安天皇>]1", "@A", "name=[孝安=ja:%%<孝安天皇>];-391-01-07"],
|
33
|
+
["[<孝霊>=ja:%%<孝霊天皇>]1", "@A", "name=[孝霊=ja:%%<孝霊天皇>];-289-01-12"],
|
34
|
+
["[<孝元>=ja:%%<孝元天皇>]1", "@A", "name=[孝元=ja:%%<孝元天皇>];-213-01-14"],
|
35
|
+
["[<開化>=ja:%%<開化天皇>]0", "@A", "name=[開化=ja:%%<開化天皇>];-157-11-12"],
|
36
|
+
["[<崇神>=ja:%%<崇神天皇>]1", "@A", "name=[崇神=ja:%%<崇神天皇>];-096-01-13"],
|
37
|
+
["[<垂仁>=ja:%%<垂仁天皇>]1", "@A", "name=[垂仁=ja:%%<垂仁天皇>];-028-01-02"],
|
38
|
+
["[<景行>=ja:%%<景行天皇>]1", "@A", "name=[景行=ja:%%<景行天皇>];0071-07-11"],
|
39
|
+
["[<成務>=ja:%%<成務天皇>]1", "@A", "name=[成務=ja:%%<成務天皇>];0131-01-05"],
|
40
|
+
["[<仲哀>=ja:%%<仲哀天皇>]1", "@A", "name=[仲哀=ja:%%<仲哀天皇>];0192-01-11"],
|
41
|
+
["[<神功皇后>=ja:%%<神功皇后>]0", "@A","name=[神功皇后=ja:%%<神功皇后>];0200-02-07"],
|
42
|
+
["[<応神>=ja:%%<応神天皇>]1", "@A", "name=[応神=ja:%%<応神天皇>];0270-01-01"],
|
43
|
+
["[<仁徳>=ja:%%<仁徳天皇>]1", "@A", "name=[仁徳=ja:%%<仁徳天皇>];0313-01-03"],
|
44
|
+
["[<履中>=ja:%%<履中天皇>]1", "@A", "name=[履中=ja:%%<履中天皇>];0400-02-01"],
|
45
|
+
["[<反正>=ja:%%<反正天皇>]1", "@A", "name=[反正=ja:%%<反正天皇>];0406-01-02"],
|
46
|
+
["[<允恭>=ja:%%<允恭天皇>]1", "@A", "name=[允恭=ja:%%<允恭天皇>];0412-12"],
|
47
|
+
["[<安康>=ja:%%<安康天皇>]0", "@A", "name=[安康=ja:%%<安康天皇>];0453-12-14^ChineseTwin::元嘉暦"],
|
48
|
+
["[<雄略>=ja:%%<雄略天皇>]0", "@A", "name=[雄略=ja:%%<雄略天皇>];0456-11-13"],
|
49
|
+
["[<清寧>=ja:%%<清寧天皇>]1", "@A", "name=[清寧=ja:%%<清寧天皇>];0480-01-15"],
|
50
|
+
["[<顕宗>=ja:%%<顕宗天皇>]1", "@A", "name=[顕宗=ja:%%<顕宗天皇>];0485-01-01"],
|
51
|
+
["[<仁賢>=ja:%%<仁賢天皇>]1", "@A", "name=[仁賢=ja:%%<仁賢天皇>];0488-01-05"],
|
52
|
+
["[<武烈>=ja:%%<武烈天皇>]0", "@A", "name=[武烈=ja:%%<武烈天皇>];0498-12"],
|
53
|
+
["[<継体>=ja:%%<継体天皇>]1", "@A", "name=[継体=ja:%%<継体天皇>];0507-02-04"],
|
54
|
+
["[<安閑>=ja:%%<安閑天皇>]1", "@A", "name=[安閑=ja:%%<安閑天皇>];0534"],
|
55
|
+
["[<宣化>=ja:%%<宣化天皇>]0", "@A", "name=[宣化=ja:%%<宣化天皇>];0535-12"],
|
56
|
+
["[<欽明>=ja:%%<欽明天皇>]0", "@A", "name=[欽明=ja:%%<欽明天皇>];0539-12-05"],
|
57
|
+
["[<敏達>=ja:%%<敏達天皇>]1", "@A", "name=[敏達=ja:%%<敏達天皇>];0572-04-03"],
|
58
|
+
["[<用明>=ja:%%<用明天皇>]0", "@A", "name=[用明=ja:%%<用明天皇>];0585-09-05"],
|
59
|
+
["[<崇峻>=ja:%%<崇峻天皇>]0", "@A", "name=[崇峻=ja:%%<崇峻天皇>];0587-08-02"],
|
60
|
+
["[<推古>=ja:%%<推古天皇>]0", "@A", "name=[推古=ja:%%<推古天皇>];0592-12-08"],
|
61
|
+
["[<舒明>=ja:%%<舒明天皇>]1", "@A", "name=[舒明=ja:%%<舒明天皇>];0629-01-04"],
|
62
|
+
["[<皇極>=ja:%%<皇極天皇>]1", "@A", "name=[皇極=ja:%%<皇極天皇>];0642-01-15"],
|
63
|
+
["[大化]1", "@A", "name=[孝徳=ja:%%<孝徳天皇>];0645-06-19"],
|
64
|
+
["[白雉]1", "@FE", " 0650-02-15"],
|
65
|
+
["[<斉明>=ja:%%<皇極天皇>]1", "@A", "name=[斉明=ja:%%<皇極天皇>];0655-01-03"],
|
66
|
+
["[<天智>=ja:%%<天智天皇>]1", "@A", "name=[天智=ja:%%<天智天皇>];0662-01-01"],
|
67
|
+
["[<天武>=ja:%%<天武天皇>]1", "@A", "name=[天武=ja:%%<天武天皇>];0672-01-01"],
|
68
|
+
["[朱鳥]1", "", "0686-07-20", "0687-01-01"]
|
70
69
|
]]
|
71
70
|
end
|
@@ -1,1482 +1,1482 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
|
-
=begin
|
3
|
-
Copyright (C) 2012-2014 Takashi SUGA
|
4
|
-
|
5
|
-
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
|
-
=end
|
7
|
-
|
8
|
-
require 'when_exe/ephemeris/notes'
|
9
|
-
require 'when_exe/region/japanese/residues'
|
10
|
-
|
11
|
-
class When::CalendarNote
|
12
|
-
|
13
|
-
#
|
14
|
-
# 日本暦注
|
15
|
-
#
|
16
|
-
class Japanese < self
|
17
|
-
|
18
|
-
autoload :Eclipse, 'when_exe/region/japanese/eclipses'
|
19
|
-
|
20
|
-
#
|
21
|
-
# 日本暦注が使用する暦法
|
22
|
-
#
|
23
|
-
# @private
|
24
|
-
class Cal4Note
|
25
|
-
def initialize(calendar, solar)
|
26
|
-
@calendar = calendar
|
27
|
-
@solar = solar
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
31
|
-
#
|
32
|
-
# 日本暦注の要素
|
33
|
-
#
|
34
|
-
# @private
|
35
|
-
class Note < When::CalendarNote::NoteElement
|
36
|
-
end
|
37
|
-
|
38
|
-
#
|
39
|
-
# 日本暦注の要素
|
40
|
-
#
|
41
|
-
Notes = [When::BasicTypes::M17n, [
|
42
|
-
"locale:[=ja:, en=en:]",
|
43
|
-
"names:[
|
44
|
-
|
45
|
-
# 年の暦注 ----------------------------
|
46
|
-
[When::BasicTypes::M17n,
|
47
|
-
"names:[年]",
|
48
|
-
[Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
|
49
|
-
# [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
|
50
|
-
# 'position:共通'], # 干
|
51
|
-
# [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
|
52
|
-
# 'position:共通'], # 支
|
53
|
-
[Note, 0x3800, "label:[廿八宿=ja:%%<二十八宿>]",
|
54
|
-
'position:共通'], # 1: 廿八宿
|
55
|
-
[Note, 0x3FFC, "label:[大歳壇=]", 'position:暦序'], # 2: 干支
|
56
|
-
[Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
|
57
|
-
[Note, 0xFFFC, "label:[納音]", 'position:暦序', 'suffix:是'], # 4: 干支
|
58
|
-
[Note, 0xFFFF, "label:[大歳=ja:%%<太歳神>]",
|
59
|
-
'position:暦序', 'suffix:在'], # 5: 干支
|
60
|
-
[Note, 0xFFFF, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
|
61
|
-
'position:暦序', 'suffix:在'], # 6: 支
|
62
|
-
[Note, 0xFFFF, "label:[大陰=ja:%%<太陰神>]",
|
63
|
-
'position:暦序', 'suffix:在'], # 7: 支
|
64
|
-
[Note, 0xFFFF, "label:[歳徳=ja:%%<歳徳神>]",
|
65
|
-
'position:暦序', 'suffix:在'], # 8: 干
|
66
|
-
[Note, 0xFFFF, "label:[歳刑=ja:%%<歳刑神>]",
|
67
|
-
'position:暦序', 'suffix:在'], # 9: 支
|
68
|
-
[Note, 0xFFFF, "label:[歳破=ja:%%<歳破神>]",
|
69
|
-
'position:暦序', 'suffix:在'], # 10: 支
|
70
|
-
[Note, 0xFFFF, "label:[歳煞=ja
|
71
|
-
'position:暦序', 'suffix:在'], # 11: 支
|
72
|
-
[Note, 0xFFFF, "label:[黄幡=ja:%%<黄幡神>]",
|
73
|
-
'position:暦序', 'suffix:在'], # 12: 支
|
74
|
-
[Note, 0xFFFF, "label:[豹尾=ja:%%<豹尾神>]",
|
75
|
-
'position:暦序', 'suffix:在'], # 13: 支
|
76
|
-
[Note, 0x0003, "label:[天道=]", 'position:暦序', 'suffix:-'], # 14: 支
|
77
|
-
[Note, 0x0003, "label:[人道=]", 'position:暦序', 'suffix:-'], # 15: 支
|
78
|
-
[Note, 0x3FFC, "label:[歳次=]", 'position:暦序', 'suffix:-'], # 16: 支
|
79
|
-
[Note, 0xF800, "label:[金神]", 'position:仮名暦', 'suffix:在'], # 17: 干
|
80
|
-
[Note, 0xFFFF, "label:[大小]", 'position:暦序'] # 18: 朔閏表
|
81
|
-
],
|
82
|
-
|
83
|
-
# 月の暦注 ----------------------------
|
84
|
-
[When::BasicTypes::M17n,
|
85
|
-
"names:[月]",
|
86
|
-
[Note, 0xFFFF, "label:[月名=ja:%%<月_(暦)>#%.<日本の和風月名>, Month]",
|
87
|
-
'position:月建'], # 0: 月の和名
|
88
|
-
# [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 干支
|
89
|
-
# [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
|
90
|
-
# 'position:共通'], # 干
|
91
|
-
# [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
|
92
|
-
# 'position:共通'], # 支
|
93
|
-
[Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
|
94
|
-
'position:共通'], # 1: 廿八宿
|
95
|
-
[Note, 0xFFFC, "label:[月建=]", 'position:月建', 'suffix:-' ], # 2: 年の十干と暦月
|
96
|
-
[Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
|
97
|
-
[Note, 0x0003, "label:[天氣=]", 'position:月建', 'suffix:-' ], # 4: 暦月
|
98
|
-
[Note, 0x3FFF, "label:[天道=]", 'position:月建', 'suffix:-' ], # 5: 暦月
|
99
|
-
[Note, 0x0003, "label:[人道=]", 'position:月建', 'suffix:-' ], # 6: 暦月
|
100
|
-
[Note, 0x0003, "label:[月破=]", 'position:月建', 'suffix:在'], # 7: 暦月
|
101
|
-
[Note, 0x3FFC, "label:[天徳=]", 'position:月建', 'suffix:在'], # 8: 暦月
|
102
|
-
[Note, 0x3FFF, "label:[月煞=]", 'position:月建', 'suffix:在'], # 9: 暦月
|
103
|
-
[Note, 0x3FFF, "label:[用時=]", 'position:月建', 'suffix:-' ], # 10: 暦月
|
104
|
-
[Note, 0x3FFF, "label:[月徳=]", 'position:月建', 'suffix:在'], # 11: 暦月
|
105
|
-
[Note, 0x3FFC, "label:[月徳合=]", 'position:月建', 'suffix:在'], # 12: 暦月
|
106
|
-
[Note, 0x3FFC, "label:[月空=]", 'position:月建', 'suffix:在'], # 13: 暦月
|
107
|
-
[Note, 0x3FFF, "label:[三鏡=]", 'position:月建', 'suffix:-' ], # 14: 暦月
|
108
|
-
[Note, 0x3FFF, "label:[土府=]", 'position:月建', 'suffix:在'], # 15: 暦月
|
109
|
-
[Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
|
110
|
-
'position:月建', 'suffix:在'], # 16: 暦月
|
111
|
-
[Note, 0xFFFF, "label:[大小]", 'position:月建'] # 17: 朔閏表
|
112
|
-
],
|
113
|
-
|
114
|
-
# 日の暦注 ----------------------------
|
115
|
-
[When::BasicTypes::M17n,
|
116
|
-
"names:[日]",
|
117
|
-
[Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
|
118
|
-
# [Note, 0x, "label:[干=ja:%%<十干>]",
|
119
|
-
# 'position:共通'], # 干
|
120
|
-
# [Note, 0x, "label:[支=ja:%%<十二支>]",
|
121
|
-
# 'position:共通'], # 支
|
122
|
-
[Note, 0x3FFF, "label:[納音]", 'position:共通', 'suffix:是'], # 1: 干支
|
123
|
-
[Note, 0xFFFF, "label:[十二直]", 'position:共通'], # 2: 支 節月
|
124
|
-
[Note, 0xFFFF, "label:[七曜]", 'position:共通'], # 3: 七曜
|
125
|
-
[Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
|
126
|
-
'position:共通'], # 4: 廿八宿
|
127
|
-
[Note, 0x07F8, "label:[廿七宿=ja:%%<二十八宿>]",
|
128
|
-
'position:共通'], # 5: 暦月 暦日
|
129
|
-
[Note, 0xC000, "label:[九星]", 'position:民間'], # 6: 九星
|
130
|
-
[Note, 0x8000, "label:[六曜]", 'position:民間'], # 7: 暦月 暦日
|
131
|
-
[Note, 0xE000, "label:[祝祭日]", 'position:祝祭日'], # 8: 暦月 暦日 (七曜)
|
132
|
-
[Note, 0xFFFF, "label:[廿四節気=ja:%%<二十四節気>]",
|
133
|
-
'position:時候'], # 9: 太陽黄経
|
134
|
-
[Note, 0xFFFF, "label:[節中=]", 'position:時候'], # 10: 太陽黄経
|
135
|
-
[Note, 0xFFFC, "label:[七十二候]", 'position:時候'], # 11: 太陽黄経
|
136
|
-
[Note, 0x3FFC, "label:[六十卦=]", 'position:時候'], # 12: 太陽黄経
|
137
|
-
[Note, 0xF800, "label:[節分]", 'position:雑節'], # 13: 立春からの日数
|
138
|
-
[Note, 0xF800, "label:[初午]", 'position:雑節'], # 14: 支 節月 or 暦月
|
139
|
-
[Note, 0xF800, "label:[八十八夜]", 'position:雑節'], # 15: 立春からの日数
|
140
|
-
[Note, 0xF800, "label:[入梅]", 'position:雑節'], # 16: 干 太陽黄経
|
141
|
-
[Note, 0xF800, "label:[半夏生]", 'position:雑節'], # 17: 干 太陽黄経
|
142
|
-
[Note, 0xF800, "label:[二百十日]", 'position:雑節'], # 18: 立春からの日数
|
143
|
-
[Note, 0xF800, "label:[
|
144
|
-
|
145
|
-
[Note, 0x3FFC, "label:[大禍=ja:%%<暦注下段>#%.<大禍日>]",
|
146
|
-
'position:上段 上段 欄外 欄外', 'suffix:日'], # 20: 支 節月
|
147
|
-
[Note, 0x3FFC, "label:[滅門=ja:%%<暦注下段>#%.<滅門日>]",
|
148
|
-
'position:上段 上段 欄外 欄外', 'suffix:日'], # 21: 支 節月
|
149
|
-
[Note, 0x3FFC, "label:[狼藉=ja:%%<暦注下段>#%.<狼藉日>]",
|
150
|
-
'position:上段 上段 欄外 欄外', 'suffix:日'], # 22: 支 節月
|
151
|
-
|
152
|
-
[Note, 0x07F8, "label:[甘露=]", 'position:上段 上段 上段 上段', 'suffix:日'], # 23: 七曜 廿七宿
|
153
|
-
[Note, 0x07F8, "label:[金剛峯=]", 'position:上段 上段 上段 上段'], # 24: 七曜 廿七宿
|
154
|
-
[Note, 0x07F8, "label:[羅刹=]", 'position:上段 上段 上段 上段'], # 25: 七曜 廿七宿
|
155
|
-
|
156
|
-
[Note, 0x3FFC, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
|
157
|
-
'position:上段 上段 上段 上段', 'suffix:-'], # 26: 干支 節年
|
158
|
-
[Note, 0xFFFC, "label:[天一=ja:%%<天一神>]",
|
159
|
-
'position:上段 上段 上段 上段', 'suffix:-'], # 27: 干支
|
160
|
-
[Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
|
161
|
-
'position:上段 上段 上段 上段', 'suffix:-'], # 28: 干支
|
162
|
-
[Note, 0x3FFC, "label:[歳下食=ja:%%<暦注下段>#%.<歳下食>]",
|
163
|
-
'position:上段 上段 上段 上段'], # 29: 干支 節年
|
164
|
-
[Note, 0x3FFC, "label:[忌遠行=]", 'position:上段 上段 上段 上段'], # 30: 支 節月
|
165
|
-
[Note, 0x3FFC, "label:[忌夜行=]", 'position:上段 上段 上段 上段'], # 31: 支 節月
|
166
|
-
[Note, 0x3FFC, "label:[下食時=ja:%%<暦注下段>#%.<時下食>]",
|
167
|
-
'position:上段 上段 上段 上段', 'suffix:-'], # 32: 支 節月 貞享暦で一部廃止
|
168
|
-
[Note, 0x3FFC, "label:[天間=]", 'position:上段 上段 上段 中段上'], # 33: 干支 節月
|
169
|
-
[Note, 0x3FFC, "label:[不視病=]", 'position:上段 上段 上段 上段'], # 34: 干
|
170
|
-
[Note, 0x3FFC, "label:[不問疾=]", 'position:上段 上段 上段 上段'], # 35: 干
|
171
|
-
[Note, 0x3FFC, "label:[不弔人=]", 'position:上段 上段 上段 上段'], # 36: 支
|
172
|
-
[Note, 0xFFFC, "label:[彼岸]", 'position:仮名暦'], # 37: 太陽黄経
|
173
|
-
[Note, 0xFFFF, "label:[社=ja:%%<社日>]",
|
174
|
-
'position:中段 中段 中段 中段', 'suffix:日'], # 38: 干 太陽黄経
|
175
|
-
[Note, 0xFFFF, "label:[三伏]", 'position:中段 中段 中段 中段'], # 39: 干 太陽黄経
|
176
|
-
[Note, 0x3FFC, "label:[除手足甲=]", 'position:中段 中段 中段 中段'], # 40: 晦(除手足甲)、支(片方のみ), 没滅凶会日×
|
177
|
-
[Note, 0x3FFC, "label:[沐浴=]", 'position:中段 中段 中段 中段'], # 41: 支 没滅凶会日×
|
178
|
-
[Note, 0x3FFD, "label:[臘=ja:%%<臘日>]",
|
179
|
-
'position:中段 中段 中段 中段', 'suffix:日'], # 42: 支 太陽黄経
|
180
|
-
[Note, 0x3FFC, "label:[伐=]", 'position:中段 中段 中段 中段上', 'suffix:日'], # 43: 干支
|
181
|
-
[Note, 0x3FFC, "label:[五墓=ja:%%<暦注下段>#%.<五墓日>]",
|
182
|
-
'position:中段 中段 中段 中段下', 'suffix:日'], # 44: 干支
|
183
|
-
[Note, 0x3FFC, "label:[六蛇=]", 'position:中段 中段 中段 中段上'], # 45: 干支 節月
|
184
|
-
[Note, 0x3FFC, "label:[七鳥=]", 'position:中段 中段 中段 中段上'], # 46: 干支 節月
|
185
|
-
[Note, 0x3FFC, "label:[八龍=]", 'position:中段 中段 中段 中段上'], # 47: 干支 節月
|
186
|
-
[Note, 0x3FFC, "label:[九虎=]", 'position:中段 中段 中段 中段上'], # 48: 干支 節月
|
187
|
-
[Note, 0x07FF, "label:[没=ja:%%<没日>]",
|
188
|
-
'position:中段 中段 中段 中段', 'suffix:日'], # 49: 太陽黄経
|
189
|
-
[Note, 0xFFF8, "label:[日食]", 'position:中段 中段 中段 中段'], # 50: 日食表
|
190
|
-
[Note, 0x07FC, "label:[滅=ja
|
191
|
-
'position:中段 中段 中段 中段', 'suffix:日'], # 51: 月の位相
|
192
|
-
[Note, 0xFFF8, "label:[月食]", 'position:中段 中段 中段 中段'], # 52: 月食表
|
193
|
-
[Note, 0xC7FD, "label:[月相]", 'position:中段 中段 中段 中段'], # 53: 月の位相
|
194
|
-
[Note, 0xFFFF, "label:[土用事=ja:%%<土用>]",
|
195
|
-
'position:中段 中段 中段 中段'], # 54: 太陽黄経
|
196
|
-
[Note, 0x3FF0, "label:[伏龍=]", 'position:上段 上段 下段 下段', 'suffix:在'], # 55: 太陽黄経
|
197
|
-
|
198
|
-
[Note, 0x3FFF, "label:[凶会=ja:%%<暦注下段>#%.<凶会日>]",
|
199
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 56: 干支 節月(宣明暦以前)/暦月(貞享暦以降)
|
200
|
-
[Note, 0x3FFF, "label:[大小歳=]", 'position:下段 下段 下段 下段'], # 57: 干支 節月
|
201
|
-
[Note, 0x3FFC, "label:[歳徳=ja:%%<歳徳神>]",
|
202
|
-
'position:下段 下段 下段 下段'], # 58: 干 節年 凶会日× ~合も
|
203
|
-
[Note, 0x0003, "label:[天倉=]", 'position:古注'], # 59: 干支 節月
|
204
|
-
# [Note, 0x0003, "label:[天李=]", 'position:古注'], # 干支 節月?
|
205
|
-
[Note, 0x37FF, "label:[天恩=ja:%%<暦注下段>#%.<天恩日>]",
|
206
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 60: 干支 節月 凶会日×
|
207
|
-
[Note, 0xFFFF, "label:[天赦=ja:%%<暦注下段>#%.<天赦日>]",
|
208
|
-
'position:下段 下段 下段 下段'], # 61: 干支 節月
|
209
|
-
[Note, 0x37FF, "label:[母倉=ja:%%<暦注下段>#%.<母倉日>]",
|
210
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 62: 支 節月 凶会日×
|
211
|
-
[Note, 0x37FC, "label:[月徳=]", 'position:下段 下段 下段 下段'], # 63: 干 節月 凶会日× ~合も
|
212
|
-
[Note, 0x3FFF, "label:[九坎=]", 'position:下段 下段 下段 下段'], # 64: 支 節月
|
213
|
-
[Note, 0x3FFF, "label:[歸忌=ja:%%<暦注下段>#%.<帰忌日>]",
|
214
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 65: 支 節月
|
215
|
-
[Note, 0x3FFF, "label:[血忌=ja:%%<暦注下段>#%.<血忌日>]",
|
216
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 66: 支 節月
|
217
|
-
[Note, 0x3FFC, "label:[無翹=]", 'position:下段 下段 下段 下段'], # 67: 支 節月
|
218
|
-
[Note, 0x3FFF, "label:[厭=]", 'position:下段 下段 下段 下段'], # 68: 支 節月
|
219
|
-
[Note, 0x3FFC, "label:[重=ja:%%<暦注下段>#%.<重日>]",
|
220
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 69: 支
|
221
|
-
[Note, 0x3FFD, "label:[復=ja:%%<暦注下段>#%.<復日>]",
|
222
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 70: 干 節月
|
223
|
-
[Note, 0x3FFC, "label:[月煞=]", 'position:下段 下段 下段 下段'], # 71: 支 節月
|
224
|
-
[Note, 0x3FFF, "label:[往亡=ja:%%<暦注下段>#%.<往亡日>]",
|
225
|
-
'position:下段 下段 下段 下段', 'suffix:日'], # 72: 太陽黄経
|
226
|
-
[Note, 0x3FFF, "label:[日遊=ja:%%<日遊神>]",
|
227
|
-
'position:最下段', 'suffix:在'], # 73: 干支
|
228
|
-
[Note, 0x07FF, "label:[人神配当=]", 'position:最下段孟月', 'suffix:-'], # 74: 暦日
|
229
|
-
|
230
|
-
[Note, 0x3E00, "label:[受死=ja:%%<暦注下段>#%.<受死日>]",
|
231
|
-
'position:仮名暦', 'suffix:日'], # 75: 支 節月
|
232
|
-
[Note, 0xFFF0, "label:[八專]", 'position:仮名暦'], # 76: 干支
|
233
|
-
[Note, 0x3E00, "label:[八專間日=ja:%%<八専>]",
|
234
|
-
'position:仮名暦'], # 77: 干支
|
235
|
-
[Note, 0xC000, "label:[金神間日=ja:%%<金神>#%.<金神の遊行・間日>]",
|
236
|
-
'position:仮名暦'], # 78: 支 節月
|
237
|
-
[Note, 0xC000, "label:[金神遊行=ja:%%<金神>#%.<金神の遊行・間日>]",
|
238
|
-
'position:仮名暦'], # 79: 支 節月
|
239
|
-
[Note, 0x3FF0, "label:[天火=ja:%%<暦注下段>#%.<天火日>]",
|
240
|
-
'position:仮名暦', 'suffix:日'], # 80: 支 節月
|
241
|
-
[Note, 0x3FF0, "label:[地火=ja:%%<暦注下段>#%.<地火日>]",
|
242
|
-
'position:仮名暦', 'suffix:日'], # 81: 支 節月
|
243
|
-
[Note, 0x3800, "label:[人火=]", 'position:仮名暦'], # 82: 支 節月
|
244
|
-
[Note, 0x3800, "label:[雷火=]", 'position:仮名暦'], # 83: 支 節月
|
245
|
-
[Note, 0x3FF0, "label:[赤舌=ja:%%<赤舌日>]",
|
246
|
-
'position:仮名暦', 'suffix:日'], # 84: 暦月 暦日
|
247
|
-
[Note, 0x3E00, "label:[十死=ja:%%<暦注下段>#%.<十死日>]",
|
248
|
-
'position:仮名暦', 'suffix:日'], # 85: 支 節月
|
249
|
-
[Note, 0x3E00, "label:[道虚=]", 'position:仮名暦', 'suffix:日'], # 86: 暦日
|
250
|
-
[Note, 0x3E00, "label:[大明=ja:%%<暦注下段>#%.<大明日>]",
|
251
|
-
'position:仮名暦', 'suffix:日'], # 87: 干支
|
252
|
-
[Note, 0x0600, "label:[大赤=ja:%%<赤口日>]",
|
253
|
-
'position:仮名暦', 'suffix:日'], # 88: 暦月 暦日
|
254
|
-
[Note, 0xF800, "label:[甲子待=ja:%%<甲子>]",
|
255
|
-
'position:仮名暦'], # 89: 干支
|
256
|
-
[Note, 0xC000, "label:[己巳]", 'position:仮名暦'], # 90: 干支
|
257
|
-
[Note, 0xF800, "label:[庚申待]", 'position:仮名暦'], # 91: 干支
|
258
|
-
[Note, 0x3800, "label:[犯土]", 'position:仮名暦'], # 92: 干支
|
259
|
-
[Note, 0xF800, "label:[十方暮]", 'position:仮名暦'], # 93: 干支
|
260
|
-
[Note, 0xF800, "label:[一粒万倍=ja:%%<一粒万倍日>]",
|
261
|
-
'position:仮名暦', 'suffix:日'], # 94: 支 節月
|
262
|
-
[Note, 0x3800, "label:[天福=]", 'position:仮名暦'], # 95: 支 節月
|
263
|
-
[Note, 0x3800, "label:[地福=]", 'position:仮名暦'], # 96: 支 節月
|
264
|
-
[Note, 0x3800, "label:[地五福=]", 'position:仮名暦'], # 97: 支 節月
|
265
|
-
[Note, 0xB800, "label:[三隣亡]", 'position:仮名暦'], # 98: 支 節月
|
266
|
-
[Note, 0xF800, "label:[不成就=ja:%%<不成就日>]",
|
267
|
-
'position:仮名暦', 'suffix:日'], # 99: 暦月 暦日/晦日
|
268
|
-
[Note, 0x3800, "label:[鬼宿]", 'position:仮名暦'], #100: 廿八宿
|
269
|
-
[Note, 0x3800, "label:[金性=]", 'position:仮名暦'], #101: 支 節月 支 節年
|
270
|
-
[Note, 0x3FFF, "label:[三寶吉=
|
271
|
-
'position:上段 上段 上段 上段'], #102: 干支 節月
|
272
|
-
[Note, 0x3FFF, "label:[神吉=ja:%%<暦注下段>#%.<神吉日>]",
|
273
|
-
'position:上段 上段 中段 中段上', 'suffix:日'], #103: 干支 節月
|
274
|
-
[Note, 0x3FFF, "label:[雑事吉=]", 'position:雑事吉'], #104: 干支 節月
|
275
|
-
[Note, 0x3FFF, "label:[小字注=]", 'position:下段小字 下段小字 下段小字 下段小字'],#105: 干支 節月
|
276
|
-
]
|
277
|
-
]]
|
278
|
-
|
279
|
-
#
|
280
|
-
# 日本暦注の時代変遷
|
281
|
-
#
|
282
|
-
# @private
|
283
|
-
NoteTypes = (2...When::TM::CalendarEra::JapaneseSolar[2].size).to_a.map {|i|
|
284
|
-
calendars =
|
285
|
-
[When::TM::CalendarEra::JapaneseLuniSolar[2][i][2],
|
286
|
-
When::TM::CalendarEra::JapaneseSolar[2][i][2]].map {|epoch|
|
287
|
-
epoch =~ /\A(-?\d+)-(\d+)-(\d+)\^(.+)\z/
|
288
|
-
$4
|
289
|
-
}
|
290
|
-
[$2 == '01' ? $1.to_i : $1.to_i+1, Cal4Note.new(*calendars)]
|
291
|
-
}.reverse
|
292
|
-
|
293
|
-
# @private
|
294
|
-
NoteRange = [
|
295
|
-
# 開始 具注暦 七十二候 index mask
|
296
|
-
[-660, 0, 0], # ~ 696 0 : 0001
|
297
|
-
[ 697, 0, 0], # ~ 763 1 : 0002
|
298
|
-
[ 764, 0, 2], # ~ 800 2 : 0004
|
299
|
-
[ 801, 0, 2], # ~ 900 3 : 0008
|
300
|
-
[ 901, 0, 2], # ~1003 4 : 0010
|
301
|
-
[1004, 1, 2], # ~1047 5 : 0020
|
302
|
-
[1048, 1, 2], # ~1100 6 : 0040
|
303
|
-
[1101, 1, 2], # ~1184 7 : 0080
|
304
|
-
[1185, 2, 2], # ~1300 8 : 0100
|
305
|
-
[1301, 2, 2], # ~1337 9 : 0200
|
306
|
-
[1338, 3, 2], # ~1684 10 : 0400
|
307
|
-
[1685, 3, 3], # ~1754 11 : 0800
|
308
|
-
[1755, 3, 4], # ~1867 12 : 1000
|
309
|
-
[1868, 3, 4], # ~1872 13 : 2000
|
310
|
-
[1873, 3, 4], # ~1873 14 : 4000
|
311
|
-
[1874, 3, 5] # ~ 15 : 8000
|
312
|
-
]
|
313
|
-
|
314
|
-
# @private
|
315
|
-
NoteFocused = (0...NoteRange.size).to_a.map {|range|
|
316
|
-
(2..4).to_a.map {|cord|
|
317
|
-
notes = Notes[1][cord]
|
318
|
-
(2...notes.size).to_a.inject([]) {|focused,note|
|
319
|
-
focused << notes[note][2][/\[.+?[=\]]/][1..-2] if notes[note][1][range] == 1
|
320
|
-
focused
|
321
|
-
}
|
322
|
-
}
|
323
|
-
}
|
324
|
-
|
325
|
-
#
|
326
|
-
# 月の大小
|
327
|
-
#
|
328
|
-
# @private
|
329
|
-
MonthPattern = {
|
330
|
-
29 => '小',
|
331
|
-
30 => '大',
|
332
|
-
-28 => '平',
|
333
|
-
-29 => '閏',
|
334
|
-
-30 => '小',
|
335
|
-
-31 => '大'
|
336
|
-
}
|
337
|
-
|
338
|
-
#
|
339
|
-
# 日本暦注に対応するインデックス(整数値)
|
340
|
-
#
|
341
|
-
# @private
|
342
|
-
module Index
|
343
|
-
# @private
|
344
|
-
[[2,'Y'], [3,'M'], [4,'D']].map {|cord|
|
345
|
-
index, initial = cord
|
346
|
-
notes = Notes[1][index]
|
347
|
-
(notes.size-2).times {|no|
|
348
|
-
name = initial + notes[no+2][2][/\[.+?[=\]]/][1..-2]
|
349
|
-
mask = 'M' + name
|
350
|
-
const_set(name, no)
|
351
|
-
const_set(mask, 1<<no)
|
352
|
-
}
|
353
|
-
}
|
354
|
-
end
|
355
|
-
|
356
|
-
#
|
357
|
-
# 日本暦注が使用する暦法
|
358
|
-
#
|
359
|
-
# @private
|
360
|
-
class Cal4Note
|
361
|
-
attr_reader :calendar, :solar
|
362
|
-
|
363
|
-
def l_calendar
|
364
|
-
@l_calendar ||= When.Calendar(@calendar.kind_of?(String) ? @calendar.sub(/#\{\?.+?\}/, '') : @calendar)
|
365
|
-
end
|
366
|
-
|
367
|
-
def s_calendar
|
368
|
-
@s_calendar ||= When.Calendar(@solar.kind_of?(String) ? @solar.sub(/#\{\?.+?\}/, '?Clock=THS') : @solar)
|
369
|
-
end
|
370
|
-
|
371
|
-
def l_phases
|
372
|
-
@l_phases ||= Japanese::LunarPhases.new('formula'=>l_calendar.formula[-1])
|
373
|
-
end
|
374
|
-
|
375
|
-
def s_terms
|
376
|
-
@s_terms ||= Japanese::SolarTerms.new('formula'=>s_calendar.formula[0])
|
377
|
-
end
|
378
|
-
|
379
|
-
def s_terms2
|
380
|
-
@s_terms2 ||= @l_calendar.iri =~ /JapaneseTwin(.*?)::天保暦/ ?
|
381
|
-
Japanese::SolarTermsRevised.new('formula'=>s_calendar.formula[0]) : s_terms
|
382
|
-
end
|
383
|
-
|
384
|
-
def doyo
|
385
|
-
@doyo ||= (s_calendar.doyo ? s_calendar.doyo * 360.0 / s_calendar.year_length : 0)
|
386
|
-
end
|
387
|
-
end
|
388
|
-
|
389
|
-
#
|
390
|
-
# 日本暦注用の Notes の要素のための内部クラス
|
391
|
-
#
|
392
|
-
# @private
|
393
|
-
class Note
|
394
|
-
|
395
|
-
attr_reader :label, :position, :suffix
|
396
|
-
|
397
|
-
def to_note_hash(note, dates=nil)
|
398
|
-
{
|
399
|
-
:note => self,
|
400
|
-
:value => case @suffix
|
401
|
-
when '是' ; [@label + '是-', note[/.\z/]]
|
402
|
-
when '在' ; [@label + '在-', note]
|
403
|
-
when '-' ; [@label + '-', note]
|
404
|
-
else ; note
|
405
|
-
end,
|
406
|
-
:position => @position[@position.size == 1 ? 0 : dates.index_g]
|
407
|
-
}
|
408
|
-
end
|
409
|
-
|
410
|
-
private
|
411
|
-
# オブジェクトの正規化
|
412
|
-
#
|
413
|
-
def _normalize(args=[], options={})
|
414
|
-
@position = @position.split(/ /)
|
415
|
-
end
|
416
|
-
end
|
417
|
-
|
418
|
-
#
|
419
|
-
# 日本暦注計算に必要となる暦日や暦法をまとめた内部クラス
|
420
|
-
#
|
421
|
-
# @private
|
422
|
-
class Dates
|
423
|
-
|
424
|
-
attr_reader :year, :precision, :cal4note, :range, :index_g, :index_s, :o_date, :l_date, :m_date, :s_date
|
425
|
-
|
426
|
-
# 初期設定
|
427
|
-
def initialize(date, year=date.most_significant_coordinate, precision=date.precision, cal4note=nil)
|
428
|
-
|
429
|
-
# 暦注パターン
|
430
|
-
if cal4note
|
431
|
-
# 年代による判定
|
432
|
-
(1...NoteRange.size).to_a.reverse.each do |i|
|
433
|
-
if year >= NoteRange[i][0]
|
434
|
-
@range = i
|
435
|
-
break
|
436
|
-
end
|
437
|
-
end
|
438
|
-
@range ||= 0
|
439
|
-
else
|
440
|
-
# 暦法による判定
|
441
|
-
cal4note = Cal4Note.new(date.frame, date.frame.twin)
|
442
|
-
@range =
|
443
|
-
case cal4note.l_calendar.formula[-1]
|
444
|
-
when When::Ephemeris::ChineseTrueLunation::JujiMethods ; 11 # 江戸時代の暦
|
445
|
-
when When::Ephemeris::ChineseTrueLunation
|
446
|
-
date.frame.twin =~ /戊寅|麟徳/ ? 1 : 10 # 唐代定朔暦(儀鳳暦 or 宣明暦)
|
447
|
-
when When::Ephemeris::MeanLunation ; 0 # 唐代以前平朔暦(元嘉暦)
|
448
|
-
else ; 15 # 現代の旧暦
|
449
|
-
end
|
450
|
-
end
|
451
|
-
|
452
|
-
# 具注暦の配置
|
453
|
-
@index_g = NoteRange[@range][1]
|
454
|
-
|
455
|
-
# 七十二候
|
456
|
-
@index_s = NoteRange[@range][2]
|
457
|
-
|
458
|
-
# その他の属性
|
459
|
-
@year = year
|
460
|
-
@precision = precision
|
461
|
-
@cal4note = cal4note
|
462
|
-
@o_date = date
|
463
|
-
@l_date = @cal4note.l_calendar ^ date
|
464
|
-
@m_date = date.frame.kind_of?(When::CalendarTypes::Christian) ? @l_date : @o_date
|
465
|
-
@s_date = @cal4note.s_calendar ^ date
|
466
|
-
end
|
467
|
-
end
|
468
|
-
|
469
|
-
NoteMethods = [:year_notes, :month_notes, :day_notes]
|
470
|
-
|
471
|
-
# 暦注の計算
|
472
|
-
#
|
473
|
-
# @param [When::TM::TemporalPosition] date 暦注を計算する日時
|
474
|
-
# (date が When::TM::TemporalPosition でない場合、When::TM::TemporalPosition に変換して使用する)
|
475
|
-
# @param [Hash] options
|
476
|
-
# :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
|
477
|
-
#
|
478
|
-
# @return [Hash] :notes が String の場合
|
479
|
-
# @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
|
480
|
-
# @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
|
481
|
-
# @note return 値の [Hash] の要素は下記の通り
|
482
|
-
# :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
|
483
|
-
# :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
|
484
|
-
# :position => 具注暦でのその暦注の配置場所(String)
|
485
|
-
#
|
486
|
-
def notes(date, options={})
|
487
|
-
dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
|
488
|
-
NotesContainer.register(indices.map {|i|
|
489
|
-
next [] unless i <= dates.precision
|
490
|
-
send(NoteMethods[i-1], dates, notes[i-1], conditions)
|
491
|
-
}, persistence, date.to_i)
|
492
|
-
end
|
493
|
-
|
494
|
-
# 太陽の位置 => 日時
|
495
|
-
#
|
496
|
-
# @param [When::TM::TemporalPosition] date 探す基準とする日時
|
497
|
-
# @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
|
498
|
-
#
|
499
|
-
# num 分子 (デフォルト 0 : 基準日時直後の春分)
|
500
|
-
#
|
501
|
-
# den 分母 (デフォルト 360 : 検索範囲の長さ)
|
502
|
-
#
|
503
|
-
# @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
|
504
|
-
# @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
|
505
|
-
#
|
506
|
-
# @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
|
507
|
-
#
|
508
|
-
def term(date, parameter=nil, precision=date.precision)
|
509
|
-
dates = _to_date_for_note(date)
|
510
|
-
result = dates.cal4note.s_terms.term(date, parameter)
|
511
|
-
patch = SolarTerms::Patch[result.to_i]
|
512
|
-
return result unless patch
|
513
|
-
num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
|
514
|
-
num = (num || 0).to_f
|
515
|
-
den = (den || 360).to_f
|
516
|
-
diff = (num - patch[0] + 1) % den - 1
|
517
|
-
return result if diff == 0
|
518
|
-
patched = result + When::P1D * diff
|
519
|
-
result.cal_date[0..-2] = patched.cal_date[0..-2]
|
520
|
-
result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
|
521
|
-
result
|
522
|
-
end
|
523
|
-
|
524
|
-
# 月の位相 => 日時
|
525
|
-
#
|
526
|
-
# @param [When::TM::TemporalPosition] date 探す基準とする日時
|
527
|
-
# @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
|
528
|
-
#
|
529
|
-
# num 分子 (デフォルト 0 : 基準日時直後の朔)
|
530
|
-
#
|
531
|
-
# den 分母 (デフォルト 30 : 検索範囲の長さ)
|
532
|
-
#
|
533
|
-
# @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
|
534
|
-
# @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
|
535
|
-
#
|
536
|
-
# @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
|
537
|
-
#
|
538
|
-
def phase(date, parameter=nil, precision=date.precision)
|
539
|
-
dates = _to_date_for_note(date)
|
540
|
-
note = dates.cal4note.l_phases
|
541
|
-
result = note.phase(date, parameter)
|
542
|
-
return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
543
|
-
|
544
|
-
time = note.phase(date, parameter, When::SYSTEM)
|
545
|
-
cn = note.formula.time_to_cn(time) % 1
|
546
|
-
case cn
|
547
|
-
when 0..0.0001, 0.9999..1 # 朔
|
548
|
-
return result if result.cal_date[-1] == 1
|
549
|
-
diff = result.cal_date[-1] < 15 ? -1 : +1
|
550
|
-
when 0.2..0.8 # 弦、望
|
551
|
-
return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
|
552
|
-
return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
|
553
|
-
diff = -1
|
554
|
-
else # その他
|
555
|
-
return result
|
556
|
-
end
|
557
|
-
|
558
|
-
patched = result + When::P1D * diff
|
559
|
-
result.cal_date[0..-2] = patched.cal_date[0..-2]
|
560
|
-
result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
|
561
|
-
result
|
562
|
-
end
|
563
|
-
|
564
|
-
private
|
565
|
-
|
566
|
-
# オブジェクトの正規化
|
567
|
-
def _normalize(args=[], options={})
|
568
|
-
@prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
|
569
|
-
super
|
570
|
-
end
|
571
|
-
|
572
|
-
# 年の暦注
|
573
|
-
def year_notes(dates, notes, conditions={})
|
574
|
-
_note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
|
575
|
-
|
576
|
-
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
|
577
|
-
root = When.Resource('_co:Common')
|
578
|
-
|
579
|
-
# 干支
|
580
|
-
residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
|
581
|
-
notes_hash['干支'] = root['干支'][residue % 60]
|
582
|
-
notes_hash['干'] = root['干' ][residue % 10]
|
583
|
-
notes_hash['支'] = root['支' ][residue % 12]
|
584
|
-
|
585
|
-
# 廿八宿
|
586
|
-
notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
|
587
|
-
|
588
|
-
# 九星
|
589
|
-
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
|
590
|
-
|
591
|
-
# 大小
|
592
|
-
unless notes_hash['大小']
|
593
|
-
year = dates.o_date.floor(When::YEAR)
|
594
|
-
month = year.floor(When::MONTH)
|
595
|
-
pattern = ''
|
596
|
-
while year == month
|
597
|
-
length = month.length(When::MONTH)
|
598
|
-
length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
|
599
|
-
pattern += '閏' if month[When::MONTH] * 0 == 1
|
600
|
-
pattern += MonthPattern[length] || '改'
|
601
|
-
month += When::P1M
|
602
|
-
end
|
603
|
-
notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
|
604
|
-
end
|
605
|
-
|
606
|
-
# その他
|
607
|
-
[notes_hash['干支'], notes_hash['干'], notes_hash['支']].each do |note|
|
608
|
-
note._year_notes(notes_hash, dates, conditions)
|
609
|
-
end
|
610
|
-
notes_hash
|
611
|
-
end
|
612
|
-
end
|
613
|
-
|
614
|
-
# 月の暦注
|
615
|
-
def month_notes(dates, notes, conditions={})
|
616
|
-
_note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
|
617
|
-
|
618
|
-
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
|
619
|
-
root = When.Resource('_co:Common')
|
620
|
-
|
621
|
-
# 干支
|
622
|
-
residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
|
623
|
-
notes_hash['干支'] = root['干支'][residue % 60]
|
624
|
-
notes_hash['干'] = root['干' ][residue % 10]
|
625
|
-
notes_hash['支'] = root['支' ][residue % 12]
|
626
|
-
|
627
|
-
# 廿八宿
|
628
|
-
notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
|
629
|
-
|
630
|
-
# 九星
|
631
|
-
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
|
632
|
-
month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
|
633
|
-
|
634
|
-
# 大小
|
635
|
-
unless notes_hash['大小']
|
636
|
-
length = dates.o_date.length(When::MONTH)
|
637
|
-
length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
|
638
|
-
notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '閏' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
|
639
|
-
end
|
640
|
-
|
641
|
-
# その他
|
642
|
-
[notes_hash['干支'], notes_hash['干'], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
|
643
|
-
note._month_notes(notes_hash, dates, conditions)
|
644
|
-
end
|
645
|
-
notes_hash
|
646
|
-
end
|
647
|
-
end
|
648
|
-
|
649
|
-
# 日の暦注
|
650
|
-
def day_notes(dates, notes, conditions={})
|
651
|
-
_note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
|
652
|
-
|
653
|
-
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
|
654
|
-
root = When.Resource('_co:Common')
|
655
|
-
|
656
|
-
# 干支
|
657
|
-
residue = dates.s_date.to_i-11
|
658
|
-
notes_hash['干支'] = root['干支'][residue % 60]
|
659
|
-
notes_hash['干'] = root['干' ][residue % 10]
|
660
|
-
notes_hash['支'] = root['支' ][residue % 12]
|
661
|
-
|
662
|
-
# その他
|
663
|
-
[SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
|
664
|
-
JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
|
665
|
-
note._day_notes(notes_hash, dates, conditions)
|
666
|
-
end
|
667
|
-
|
668
|
-
# 七曜
|
669
|
-
notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
|
670
|
-
|
671
|
-
# 廿七宿
|
672
|
-
notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
|
673
|
-
|
674
|
-
# 廿八宿 / 鬼宿
|
675
|
-
notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
|
676
|
-
notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
|
677
|
-
|
678
|
-
# 九星
|
679
|
-
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
|
680
|
-
|
681
|
-
notes_hash
|
682
|
-
end
|
683
|
-
end
|
684
|
-
|
685
|
-
#
|
686
|
-
# 日本暦日情報オブジェクトの生成
|
687
|
-
#
|
688
|
-
# @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
|
689
|
-
# そうでなければ、採用する対を年代により選択する
|
690
|
-
#
|
691
|
-
def _to_date_for_note(date)
|
692
|
-
if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
|
693
|
-
return Dates.new(date) if date.frame.twin
|
694
|
-
o_date = date
|
695
|
-
else
|
696
|
-
o_date = self.class._to_japanese_date(date)
|
697
|
-
return nil unless o_date
|
698
|
-
end
|
699
|
-
year = o_date.most_significant_coordinate
|
700
|
-
NoteTypes.each do |line|
|
701
|
-
return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
|
702
|
-
end
|
703
|
-
nil
|
704
|
-
end
|
705
|
-
|
706
|
-
#
|
707
|
-
# 任意の暦を日本年号付暦日に変換
|
708
|
-
#
|
709
|
-
def self._to_japanese_date(date)
|
710
|
-
return date if date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
|
711
|
-
(date^ When.era(:area=>'日本')).each do |list|
|
712
|
-
return list[0] if list[0]
|
713
|
-
end
|
714
|
-
nil
|
715
|
-
end
|
716
|
-
|
717
|
-
#
|
718
|
-
# 廿七宿を Resudue 化
|
719
|
-
#
|
720
|
-
def _residue27(index, root)
|
721
|
-
return index unless index.kind_of?(Integer)
|
722
|
-
root['宿'][index]
|
723
|
-
end
|
724
|
-
|
725
|
-
#
|
726
|
-
# 月の干支
|
727
|
-
#
|
728
|
-
def month_stem_branch(date)
|
729
|
-
date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
|
730
|
-
(date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
|
731
|
-
end
|
732
|
-
end
|
733
|
-
|
734
|
-
#
|
735
|
-
# 太陽暦の暦注・祝祭日
|
736
|
-
#
|
737
|
-
class JapaneseSolarNote < self
|
738
|
-
|
739
|
-
#
|
740
|
-
# 祝祭日一覧
|
741
|
-
#
|
742
|
-
NotesList = {
|
743
|
-
[ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
|
744
|
-
[ 1, 3] => [[1874..1948, '元始祭']],
|
745
|
-
[ 1, 5] => [[1874..1948, '新年宴会']],
|
746
|
-
[ 1,-2] => [[2000..2100, '成人の日']],
|
747
|
-
[ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
|
748
|
-
[ 1,29] => [[1873..1873, '神武天皇即位日']],
|
749
|
-
[ 1,30] => [[1874..1912, '孝明天皇祭']],
|
750
|
-
[ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
|
751
|
-
[ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
|
752
|
-
[ 3, 3] => [[1868..1872, '弥生節句']],
|
753
|
-
[ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
|
754
|
-
[ 4, 3] => [[1874..1948, '神武天皇祭']],
|
755
|
-
[ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
|
756
|
-
[ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
|
757
|
-
[ 5, 3] => [[1949..2100, '憲法記念日']],
|
758
|
-
[ 5, 4] => [[2007..2100, 'みどりの日']],
|
759
|
-
[ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
|
760
|
-
[ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
|
761
|
-
[ 7, 7] => [[1868..1872, '七夕節句']],
|
762
|
-
[ 7,15] => [[1868..1872, 'お盆']],
|
763
|
-
[ 7,20] => [[1996..2002, '海の日']],
|
764
|
-
[ 7,-3] => [[2003..2100, '海の日']],
|
765
|
-
[ 7,30] => [[1913..1926, '明治天皇祭']],
|
766
|
-
[ 8, 1] => [[1868..1872, '田実節句']],
|
767
|
-
[ 8,11] => [[2016..2100, '山の日']],
|
768
|
-
[ 8,31] => [[1913..1926, '天長節']],
|
769
|
-
[ 9, 9] => [[1868..1872, '重陽節句']],
|
770
|
-
[ 9,15] => [[1966..2002, '敬老の日']],
|
771
|
-
[ 9,-3] => [[2003..2100, '敬老の日']],
|
772
|
-
[ 9,17] => [[1874..1878, '神嘗祭']],
|
773
|
-
[ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
|
774
|
-
[10,10] => [[1966..1999, '体育の日']],
|
775
|
-
[10,-2] => [[2000..2100, '体育の日']],
|
776
|
-
[10,17] => [[1879..1947, '神嘗祭']],
|
777
|
-
[10,31] => [[1913..1926, '天長節祝日']],
|
778
|
-
[11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
|
779
|
-
[11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
|
780
|
-
[11,12] => [[1990..1990, '即位の礼正殿の儀']],
|
781
|
-
[11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
|
782
|
-
[11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
|
783
|
-
[11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
|
784
|
-
[12,23] => [[1989..2100, '天皇誕生日']],
|
785
|
-
[12,25] => [[1927..1947, '大正天皇祭']]
|
786
|
-
}
|
787
|
-
|
788
|
-
# @private
|
789
|
-
Long = {3=>0, 9=>180}
|
790
|
-
|
791
|
-
class << self
|
792
|
-
|
793
|
-
# 日の暦注 - 祝祭日の計算
|
794
|
-
# @private
|
795
|
-
def _day_notes(notes, dates, conditions={})
|
796
|
-
# 明治維新以降の実暦日のみ扱う
|
797
|
-
return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
|
798
|
-
year = dates.o_date.most_significant_coordinate
|
799
|
-
return notes unless year >= 1868
|
800
|
-
|
801
|
-
# 春分の日と秋分の日を祝祭日に加える
|
802
|
-
long = Long[dates.o_date.cal_date[1]] if year >= 1878
|
803
|
-
if long
|
804
|
-
date = When.when?(dates.o_date.to_cal_date.to_s,
|
805
|
-
{:frame=>dates.o_date.frame,
|
806
|
-
:clock=>dates.s_date.frame.time_basis})
|
807
|
-
term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
|
808
|
-
When::DAY), [long,360]).cal_date[1..2]
|
809
|
-
list = NotesList.dup
|
810
|
-
list[term] = list[[term[0],0]]
|
811
|
-
else
|
812
|
-
list = NotesList
|
813
|
-
end
|
814
|
-
|
815
|
-
# 「国民の休日」制定以前
|
816
|
-
notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
|
817
|
-
return notes if notes['祝祭日'] || year < 1988
|
818
|
-
|
819
|
-
# 「国民の休日」制定以後
|
820
|
-
duration = When.Duration('P1D')
|
821
|
-
[duration, -duration].each do |d|
|
822
|
-
return notes unless _holiday(list, dates.o_date + d)
|
823
|
-
end
|
824
|
-
notes['祝祭日'] = '国民の休日'
|
825
|
-
return notes
|
826
|
-
end
|
827
|
-
|
828
|
-
private
|
829
|
-
|
830
|
-
# 振替休日とハッピーマンデーを考慮した祝祭日
|
831
|
-
def _holiday(list, date, alternate=nil)
|
832
|
-
y = date.most_significant_coordinate
|
833
|
-
m, d = date.cal_date[1..2]
|
834
|
-
|
835
|
-
# 「振替休日」制定以前
|
836
|
-
note = _note(list, y, m, d)
|
837
|
-
return note if note || y < 1973
|
838
|
-
|
839
|
-
# 「振替休日」制定以降
|
840
|
-
case date.to_i % 7
|
841
|
-
when 0 # 月曜
|
842
|
-
# 振替休日
|
843
|
-
note = _note(list, y, m, d-1)
|
844
|
-
return alternate if note
|
845
|
-
# ハッピーマンデー
|
846
|
-
note = _note(list, y, m, -((d-1)/7 + 1))
|
847
|
-
return note if note
|
848
|
-
when 1,2 # 火曜・水曜
|
849
|
-
# 振替休日
|
850
|
-
return alternate if y >= 2007 && m == 5 && d == 6
|
851
|
-
end
|
852
|
-
end
|
853
|
-
|
854
|
-
# 振替休日とハッピーマンデーを考慮しない祝祭日
|
855
|
-
def _note(list, year, month, day)
|
856
|
-
return nil if day == 0
|
857
|
-
year = [year, 2100].min
|
858
|
-
note = list[[month,day]]
|
859
|
-
return nil unless note
|
860
|
-
note.each do |range|
|
861
|
-
return range[1] if range[0].include?(year)
|
862
|
-
end
|
863
|
-
return nil
|
864
|
-
end
|
865
|
-
end
|
866
|
-
end
|
867
|
-
|
868
|
-
#
|
869
|
-
# 太陰太陽暦の暦注
|
870
|
-
#
|
871
|
-
class JapaneseLuniSolarNote < self
|
872
|
-
|
873
|
-
# 変換表 月日→27宿
|
874
|
-
StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
|
875
|
-
[11, 13, 15, 17, 19, 21, 24, 0, 2, 4, 7, 9], # 0 : 本月本説 室12奎14胃16畢18參20鬼22張25角00氐02心04斗07虛10
|
876
|
-
[ 5, 3, 1, 25, 23, 21, 19, 16, 14, 11, 8, 7], # 1 : 本月異説 尾05房03亢01翼26星24鬼22參20昴17婁15室12女09斗07
|
877
|
-
[14, 16, 18, 20, 22, 24, 0, 3, 5, 7, 10, 12], # 2 : 閏月本説 婁15昴17觜19井21柳23張25角00房03尾05斗07危11壁13
|
878
|
-
[12, 14, 16, 18, 19, 21, 24, 0, 2, 5, 8, 10], # 3 : 閏月異説 壁13婁15昴17觜19參20鬼22張25角00氐02尾05女09危11
|
879
|
-
[14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
|
880
|
-
]
|
881
|
-
|
882
|
-
# 変換表 27宿→28宿
|
883
|
-
StarMansionIndex = (0..7).to_a + (9..27).to_a
|
884
|
-
|
885
|
-
# 七曜と27宿で決まる暦注
|
886
|
-
WeekDepended = {
|
887
|
-
# 日 月 火 水 木 金 土
|
888
|
-
'甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
|
889
|
-
'金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
|
890
|
-
'羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
|
891
|
-
}
|
892
|
-
|
893
|
-
# 人神配当
|
894
|
-
HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
|
895
|
-
鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内 足 踝
|
896
|
-
足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
|
897
|
-
|
898
|
-
# 月の暦注
|
899
|
-
# @private
|
900
|
-
def self._month_notes(notes, dates, conditions={})
|
901
|
-
# 月名
|
902
|
-
notes['月名'] ||= dates.o_date.name('month')
|
903
|
-
end
|
904
|
-
|
905
|
-
# 日の暦注
|
906
|
-
# @private
|
907
|
-
def self._day_notes(notes, dates, conditions={})
|
908
|
-
|
909
|
-
# 廿七宿
|
910
|
-
m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
|
911
|
-
d = (StarMansions[l==1 ? (conditions[:i27]||0) :
|
912
|
-
(conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
|
913
|
-
notes['廿七宿'] ||= StarMansionIndex[d]
|
914
|
-
|
915
|
-
# 甘露 / 金剛峯 / 羅刹
|
916
|
-
w = (dates.m_date.to_i + 1) % 7
|
917
|
-
['甘露', '金剛峯', '羅刹'].each do |c|
|
918
|
-
notes[c] = c if d == WeekDepended[c][w]
|
919
|
-
end
|
920
|
-
|
921
|
-
# 三寶吉・神吉・雑事吉・小字注 (凶会日は表引きの時点で抑制済み)
|
922
|
-
notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = notes['小字注'] = nil if notes['没'] || notes['滅']
|
923
|
-
notes['神吉'] = notes['雑事吉'] = nil if notes['往亡']
|
924
|
-
notes['神吉'] = notes['三寶吉'] = nil if notes['月食']
|
925
|
-
notes['小字注'] = nil if notes['日食'] || notes['月食']
|
926
|
-
notes['小字注'] = nil if notes['九坎'] && dates.range==5 # 11世紀後半
|
927
|
-
notes['三寶吉'] = nil if notes['羅刹']
|
928
|
-
notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
|
929
|
-
notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
|
930
|
-
|
931
|
-
# 除手足甲 & 道虚・人神配当
|
932
|
-
y,m0,d0 = dates.m_date.cal_date
|
933
|
-
misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
|
934
|
-
notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes['没'] || notes['滅'] || notes['凶会'])
|
935
|
-
notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
|
936
|
-
notes['人神配当'] = HumanBody[d0-1]
|
937
|
-
|
938
|
-
# 仮名暦
|
939
|
-
notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
|
940
|
-
notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
|
941
|
-
notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
|
942
|
-
notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
|
943
|
-
notes
|
944
|
-
end
|
945
|
-
end
|
946
|
-
|
947
|
-
#
|
948
|
-
# 月の位相による暦注
|
949
|
-
#
|
950
|
-
class Japanese::LunarPhases < LunarPhases
|
951
|
-
|
952
|
-
# 日の暦注
|
953
|
-
# @private
|
954
|
-
def self._day_notes(notes, dates, conditions={})
|
955
|
-
date = When.when?(dates.o_date.to_cal_date.to_s,
|
956
|
-
{:frame=>dates.o_date.frame,
|
957
|
-
:clock=>dates.l_date.frame.time_basis})
|
958
|
-
phase, metsu = dates.cal4note.l_phases.position(date)
|
959
|
-
|
960
|
-
# 滅
|
961
|
-
notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
|
962
|
-
|
963
|
-
# 月相
|
964
|
-
unless notes['月相']
|
965
|
-
# イベントの判定
|
966
|
-
formula = dates.cal4note.l_phases.formula
|
967
|
-
clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
|
968
|
-
(5..25).include?(dates.l_date.cal_date[2]) ?
|
969
|
-
When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
|
970
|
-
dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
|
971
|
-
odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
|
972
|
-
phases = formula.phase_range(odate)
|
973
|
-
thitis = phases.map {|phase| (phase % 1) * 30.0}
|
974
|
-
note = if thitis[0] >= thitis[1]
|
975
|
-
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
|
976
|
-
else
|
977
|
-
range = thitis[0]...thitis[1]
|
978
|
-
range.include?( 7.5) ? '上弦' :
|
979
|
-
range.include?(15.0) ? '望' :
|
980
|
-
range.include?(22.5) ? '下弦' : nil
|
981
|
-
end
|
982
|
-
|
983
|
-
# 結果の反映
|
984
|
-
if conditions[:shoyo]
|
985
|
-
# :shoyo が true ならイベント時刻も返す
|
986
|
-
notes['月相'] = if note
|
987
|
-
etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
|
988
|
-
if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
|
989
|
-
shoyo = etime.clk_time.universal_time
|
990
|
-
shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
|
991
|
-
shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
|
992
|
-
shoyo = shoyo.to_i if shoyo == shoyo.to_i
|
993
|
-
"#{note}(#{shoyo}/#{formula.denominator})"
|
994
|
-
else
|
995
|
-
etime.events = [note]
|
996
|
-
etime
|
997
|
-
end
|
998
|
-
else
|
999
|
-
nil
|
1000
|
-
end
|
1001
|
-
else
|
1002
|
-
# :shoyo が false ならイベン名のみ返す
|
1003
|
-
notes['月相'] = note
|
1004
|
-
end
|
1005
|
-
end
|
1006
|
-
|
1007
|
-
# 月食
|
1008
|
-
unless notes['月食'] && notes['神吉'] && notes['三寶吉'] && notes['小字注']
|
1009
|
-
level = (conditions[:lunar_eclipse]||0).to_i
|
1010
|
-
if level == -1
|
1011
|
-
note = nil
|
1012
|
-
else
|
1013
|
-
key = dates.m_date.to_s[/\(.+\z/]
|
1014
|
-
if key
|
1015
|
-
note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
|
1016
|
-
elsif dates.o_date.location &&
|
1017
|
-
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
1018
|
-
info = dates.o_date.location.lunar_eclipse(date..date)
|
1019
|
-
note = '月' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
|
1020
|
-
end
|
1021
|
-
if note
|
1022
|
-
note.sub!(/\*.*\z/, '')
|
1023
|
-
note = nil unless /月/ =~ note
|
1024
|
-
note = nil if level[0] == 1 && /昼/ =~ note
|
1025
|
-
note = nil if level[1] == 1 && /^\(/ =~ note
|
1026
|
-
end
|
1027
|
-
end
|
1028
|
-
notes['月食'] = note
|
1029
|
-
end
|
1030
|
-
|
1031
|
-
notes
|
1032
|
-
end
|
1033
|
-
end
|
1034
|
-
|
1035
|
-
#
|
1036
|
-
# 太陽黄経による暦注
|
1037
|
-
#
|
1038
|
-
class Japanese::SolarTerms < SolarTerms
|
1039
|
-
|
1040
|
-
Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
|
1041
|
-
|
1042
|
-
Notes10 = [
|
1043
|
-
%w(初伏 初伏),
|
1044
|
-
%w(仲伏 中伏),
|
1045
|
-
%w(後伏 末伏)]
|
1046
|
-
|
1047
|
-
Notes60_A = [
|
1048
|
-
# +0
|
1049
|
-
'侯小過外', # 315 : 正月
|
1050
|
-
'侯需外', # 345 : 二月
|
1051
|
-
'侯豫外', # 15 : 三月
|
1052
|
-
'侯旅外', # 45 : 四月
|
1053
|
-
'侯大有外', # 75 : 五月
|
1054
|
-
'侯鼎外', # 105 : 六月
|
1055
|
-
'侯恆外', # 135 : 七月
|
1056
|
-
'侯巽外', # 165 : 八月
|
1057
|
-
'侯歸妹外', # 195 : 九月
|
1058
|
-
'侯艮外', # 225 : 十月
|
1059
|
-
'侯未濟外', # 255 : 十一月
|
1060
|
-
'侯屯外' # 285 : 十二月
|
1061
|
-
]
|
1062
|
-
|
1063
|
-
Notes60_B = [
|
1064
|
-
# +3 +9 +15 +21 +27
|
1065
|
-
'大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
|
1066
|
-
'大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
|
1067
|
-
'大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
|
1068
|
-
'大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
|
1069
|
-
'大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
|
1070
|
-
'大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
|
1071
|
-
'大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
|
1072
|
-
'大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
|
1073
|
-
'大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
|
1074
|
-
'大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
|
1075
|
-
'大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
|
1076
|
-
'大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
|
1077
|
-
]
|
1078
|
-
|
1079
|
-
Notes72 = [
|
1080
|
-
# 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
|
1081
|
-
# 315 : 正月
|
1082
|
-
%w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
|
1083
|
-
%w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
|
1084
|
-
%w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
|
1085
|
-
%w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
|
1086
|
-
%w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
|
1087
|
-
%w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
|
1088
|
-
|
1089
|
-
# 345 : 二月
|
1090
|
-
%w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
|
1091
|
-
%w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
|
1092
|
-
%w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
|
1093
|
-
%w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
|
1094
|
-
%w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
|
1095
|
-
%w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
|
1096
|
-
|
1097
|
-
# 15 : 三月
|
1098
|
-
%w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
|
1099
|
-
%w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
|
1100
|
-
%w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
|
1101
|
-
%w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
|
1102
|
-
%w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
|
1103
|
-
%w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
|
1104
|
-
|
1105
|
-
# 45 : 四月
|
1106
|
-
%w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
|
1107
|
-
%w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
|
1108
|
-
%w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
|
1109
|
-
%w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
|
1110
|
-
%w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
|
1111
|
-
%w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
|
1112
|
-
|
1113
|
-
# 75 : 五月
|
1114
|
-
%w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
|
1115
|
-
%w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
|
1116
|
-
%w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
|
1117
|
-
%w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
|
1118
|
-
%w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
|
1119
|
-
%w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
|
1120
|
-
|
1121
|
-
# 105 : 六月
|
1122
|
-
%w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
|
1123
|
-
%w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
|
1124
|
-
%w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
|
1125
|
-
%w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
|
1126
|
-
%w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
|
1127
|
-
%w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
|
1128
|
-
|
1129
|
-
# 135 : 七月
|
1130
|
-
%w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
|
1131
|
-
%w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
|
1132
|
-
%w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
|
1133
|
-
%w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
|
1134
|
-
%w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
|
1135
|
-
%w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
|
1136
|
-
|
1137
|
-
# 165 : 八月
|
1138
|
-
%w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
|
1139
|
-
%w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
|
1140
|
-
%w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
|
1141
|
-
%w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
|
1142
|
-
%w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
|
1143
|
-
%w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
|
1144
|
-
|
1145
|
-
# 195 : 九月
|
1146
|
-
%w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
|
1147
|
-
%w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
|
1148
|
-
%w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
|
1149
|
-
%w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
|
1150
|
-
%w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
|
1151
|
-
%w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
|
1152
|
-
|
1153
|
-
# 225 : 十月
|
1154
|
-
%w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
|
1155
|
-
%w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
|
1156
|
-
%w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
|
1157
|
-
%w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
|
1158
|
-
%w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
|
1159
|
-
%w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
|
1160
|
-
|
1161
|
-
# 255 : 十一月
|
1162
|
-
%w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
|
1163
|
-
%w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
|
1164
|
-
%w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
|
1165
|
-
%w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
|
1166
|
-
%w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
|
1167
|
-
%w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
|
1168
|
-
|
1169
|
-
# 285 : 十二月
|
1170
|
-
%w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
|
1171
|
-
%w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
|
1172
|
-
%w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
|
1173
|
-
%w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
|
1174
|
-
%w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
|
1175
|
-
%w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
|
1176
|
-
]
|
1177
|
-
|
1178
|
-
# 計算結果の修正
|
1179
|
-
# @private
|
1180
|
-
Patch = {
|
1181
|
-
2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0] 没
|
1182
|
-
2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
|
1183
|
-
|
1184
|
-
2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0] 没
|
1185
|
-
2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
|
1186
|
-
|
1187
|
-
2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
|
1188
|
-
2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
|
1189
|
-
2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
|
1190
|
-
2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0] 没
|
1191
|
-
|
1192
|
-
2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0] 没
|
1193
|
-
2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
|
1194
|
-
|
1195
|
-
2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
|
1196
|
-
2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
|
1197
|
-
2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0] 没
|
1198
|
-
|
1199
|
-
2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
|
1200
|
-
2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
|
1201
|
-
2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
|
1202
|
-
2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
|
1203
|
-
2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
|
1204
|
-
2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
|
1205
|
-
2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
|
1206
|
-
2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
|
1207
|
-
2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
|
1208
|
-
2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
|
1209
|
-
2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
|
1210
|
-
2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
|
1211
|
-
2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
|
1212
|
-
2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
|
1213
|
-
2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] 没 (処暑の前日)
|
1214
|
-
|
1215
|
-
2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0] 没
|
1216
|
-
2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
|
1217
|
-
|
1218
|
-
2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
|
1219
|
-
2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0] 没
|
1220
|
-
|
1221
|
-
2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0] 没
|
1222
|
-
2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
|
1223
|
-
}
|
1224
|
-
|
1225
|
-
class << self
|
1226
|
-
# テスト用の属性
|
1227
|
-
attr_writer :patch
|
1228
|
-
private :patch=
|
1229
|
-
|
1230
|
-
# 日の暦注
|
1231
|
-
# @private
|
1232
|
-
def _day_notes(notes, dates, conditions={})
|
1233
|
-
date = When.when?(dates.o_date.to_cal_date.to_s,
|
1234
|
-
{:frame=>dates.o_date.frame,
|
1235
|
-
:clock=>dates.s_date.frame._time_basis[0]})
|
1236
|
-
patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
|
1237
|
-
dates.o_date.frame.twin
|
1238
|
-
longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
|
1239
|
-
|
1240
|
-
# 三伏 - 庚
|
1241
|
-
#
|
1242
|
-
# 初 : 夏至から 20..29
|
1243
|
-
# 仲 : 夏至から 30..39
|
1244
|
-
# 後 : 立秋から 0..9
|
1245
|
-
if !notes['三伏'] && notes['干'].remainder == 6 # 庚
|
1246
|
-
index = dates.range >= 11 ? 1 : 0
|
1247
|
-
if 109 <= longitude && longitude <= 129 # 夏至から
|
1248
|
-
term = dates.cal4note.s_terms.term(date, [-270,360])
|
1249
|
-
diff = dates.s_date.to_i - term.to_i
|
1250
|
-
notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
|
1251
|
-
notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
|
1252
|
-
elsif longitude == 135 # 立秋
|
1253
|
-
notes['三伏'] = Notes10[2][index]
|
1254
|
-
elsif 136 <= longitude && longitude <= 144 # 立秋から
|
1255
|
-
term = dates.cal4note.s_terms.term(date, [-225,360])
|
1256
|
-
diff = dates.s_date.to_i - term.to_i
|
1257
|
-
notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
|
1258
|
-
end
|
1259
|
-
end
|
1260
|
-
|
1261
|
-
# 社 - 戊
|
1262
|
-
#
|
1263
|
-
# 春秋分から -5..4
|
1264
|
-
if !notes['社'] && notes['干'].remainder == 4 # 戊
|
1265
|
-
if (longitude + 5) % 180 < 10 # 春秋分の近傍
|
1266
|
-
term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
|
1267
|
-
diff = dates.s_date.to_i - term.to_i
|
1268
|
-
notes['社'] = '社' if -5 <= diff && diff <= 4
|
1269
|
-
end
|
1270
|
-
end
|
1271
|
-
|
1272
|
-
# 臘 - 辰
|
1273
|
-
#
|
1274
|
-
# 大寒から -6..5
|
1275
|
-
if !notes['臘'] && notes['支'].remainder == 4 # 辰
|
1276
|
-
if (longitude - 339) % 360 < 12 # 大寒の近傍
|
1277
|
-
term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
|
1278
|
-
diff = dates.s_date.to_i - term.to_i
|
1279
|
-
notes['臘'] = '臘' if -6 <= diff && diff <= 5
|
1280
|
-
end
|
1281
|
-
end
|
1282
|
-
|
1283
|
-
# 土用事
|
1284
|
-
unless notes['土用事']
|
1285
|
-
_longitude, _motsu = dates.cal4note.s_terms2.instance_of?(self) && dates.cal4note.doyo == 0 ? [longitude, motsu] :
|
1286
|
-
dates.cal4note.s_terms2.position(date, -dates.cal4note.doyo)
|
1287
|
-
if _motsu != 0 && _longitude % 90 == 27
|
1288
|
-
notes['土用事'] =
|
1289
|
-
begin
|
1290
|
-
event_name =
|
1291
|
-
case dates.range
|
1292
|
-
when 0 ; '土用' # 元嘉暦以前
|
1293
|
-
when 1 ; '土王' # 麟徳暦
|
1294
|
-
when 2..10 ; '土用事' # 大衍暦~宣明暦
|
1295
|
-
else ; '土用入' # 貞享暦以降
|
1296
|
-
end
|
1297
|
-
if conditions[:shoyo]
|
1298
|
-
dates.cal4note.s_terms2.event_time(date, event_name, [27-dates.cal4note.doyo, 90])
|
1299
|
-
else
|
1300
|
-
event_name
|
1301
|
-
end
|
1302
|
-
end
|
1303
|
-
end
|
1304
|
-
end
|
1305
|
-
|
1306
|
-
# 入梅 - 壬
|
1307
|
-
#
|
1308
|
-
# 貞享2(1685)~ 芒種から 1..10 日の壬の日
|
1309
|
-
# 元文5(1740)~ 芒種から 0..9 日の壬の日
|
1310
|
-
# 明治9(1876)~ 太陽黄経80度
|
1311
|
-
unless notes['入梅']
|
1312
|
-
if dates.year >= 1876
|
1313
|
-
notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
|
1314
|
-
elsif notes['干'].remainder == 8 # 壬
|
1315
|
-
if (longitude - 75) % 360 <= 10 # 芒種の近傍
|
1316
|
-
term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
|
1317
|
-
diff = dates.s_date.to_i - term.to_i
|
1318
|
-
diff += 1 if dates.year >= 1740
|
1319
|
-
notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
|
1320
|
-
end
|
1321
|
-
end
|
1322
|
-
end
|
1323
|
-
|
1324
|
-
# 半夏生
|
1325
|
-
#
|
1326
|
-
# 太陽黄経100度
|
1327
|
-
notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
|
1328
|
-
|
1329
|
-
# 立春を起算日とする雑節
|
1330
|
-
#
|
1331
|
-
unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
|
1332
|
-
term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
|
1333
|
-
case dates.s_date.to_i - term.to_i
|
1334
|
-
when -1 ; notes['節分'] ||= '節分'
|
1335
|
-
when 87 ; notes['八十八夜'] ||= '八十八夜'
|
1336
|
-
when 209 ; notes['二百十日'] ||= '二百十日'
|
1337
|
-
when 219 ; notes['二百廿日'] ||= '二百廿日'
|
1338
|
-
end
|
1339
|
-
end
|
1340
|
-
|
1341
|
-
# 日食
|
1342
|
-
unless notes['日食'] && notes['小字注']
|
1343
|
-
level = (conditions[:solar_eclipse]||0).to_i
|
1344
|
-
if level == -1
|
1345
|
-
note = nil
|
1346
|
-
else
|
1347
|
-
key = dates.m_date.to_s[/\(.+\z/]
|
1348
|
-
if key
|
1349
|
-
note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
|
1350
|
-
elsif dates.o_date.location &&
|
1351
|
-
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
1352
|
-
info = dates.o_date.location.solar_eclipse(date..date)
|
1353
|
-
note = '日' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
|
1354
|
-
end
|
1355
|
-
if note
|
1356
|
-
note.sub!(/\*.*\z/, '')
|
1357
|
-
note = nil unless /日/ =~ note
|
1358
|
-
note = nil if level[0] == 1 && /夜/ =~ note
|
1359
|
-
note = nil if level[1] == 1 && /^\(/ =~ note
|
1360
|
-
end
|
1361
|
-
end
|
1362
|
-
notes['日食'] = note
|
1363
|
-
end
|
1364
|
-
|
1365
|
-
# 没
|
1366
|
-
if motsu == 0
|
1367
|
-
notes['没'] = dates.range < 11 ? '没' : nil
|
1368
|
-
return notes unless patch
|
1369
|
-
else
|
1370
|
-
notes['没'] = nil
|
1371
|
-
end
|
1372
|
-
|
1373
|
-
# 廿四節気
|
1374
|
-
div, mod = longitude.divmod(15)
|
1375
|
-
if mod == 0
|
1376
|
-
note = (div - 21) % 24
|
1377
|
-
div, mod = note.divmod(2)
|
1378
|
-
notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
|
1379
|
-
notes['廿四節気'] ||=
|
1380
|
-
begin
|
1381
|
-
residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
|
1382
|
-
if conditions[:shoyo]
|
1383
|
-
dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
|
1384
|
-
else
|
1385
|
-
residue
|
1386
|
-
end
|
1387
|
-
end
|
1388
|
-
end
|
1389
|
-
|
1390
|
-
# 七十二候
|
1391
|
-
div, mod = longitude.divmod(5)
|
1392
|
-
notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
|
1393
|
-
|
1394
|
-
# 往亡
|
1395
|
-
unless notes['往亡'] && notes['神吉'] && notes['雑事吉']
|
1396
|
-
month = dates.s_date.cal_date[-2] - 1
|
1397
|
-
day = dates.s_date.cal_date[-1] - 1
|
1398
|
-
div, mod = month.divmod(3)
|
1399
|
-
deg = (div+7)*(mod+1) + month * 30 + 314
|
1400
|
-
notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
|
1401
|
-
(deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
|
1402
|
-
end
|
1403
|
-
|
1404
|
-
# 伏龍
|
1405
|
-
notes['伏龍'] ||= {
|
1406
|
-
315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
|
1407
|
-
175 => '四隅百日', 275 => '竈内四十日'
|
1408
|
-
}[longitude]
|
1409
|
-
|
1410
|
-
# 六十卦
|
1411
|
-
div, mod = longitude.divmod(30)
|
1412
|
-
notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
|
1413
|
-
div, mod = longitude.divmod(6)
|
1414
|
-
notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
|
1415
|
-
|
1416
|
-
# 彼岸
|
1417
|
-
unless notes['彼岸']
|
1418
|
-
if dates.range < 11
|
1419
|
-
notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
|
1420
|
-
else
|
1421
|
-
term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
|
1422
|
-
case dates.s_date.to_i - term.to_i
|
1423
|
-
when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
|
1424
|
-
when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
|
1425
|
-
when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
|
1426
|
-
when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
|
1427
|
-
end
|
1428
|
-
end
|
1429
|
-
notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
|
1430
|
-
end
|
1431
|
-
|
1432
|
-
notes
|
1433
|
-
end
|
1434
|
-
end
|
1435
|
-
end
|
1436
|
-
|
1437
|
-
#
|
1438
|
-
# 太陽黄経による暦注
|
1439
|
-
#
|
1440
|
-
class Japanese::SolarTermsRevised < Japanese::SolarTerms
|
1441
|
-
|
1442
|
-
# 土用策
|
1443
|
-
DoyoShift = When::TM::PeriodDuration.new([0,0,12.1747411317])
|
1444
|
-
|
1445
|
-
# 日付に対応する座標
|
1446
|
-
#
|
1447
|
-
# @param [When::TM::TemporalPosition] date 日付
|
1448
|
-
# @param [Numeric] delta 周期の補正(土用の時刻の補正に使用,デフォルト 0)
|
1449
|
-
#
|
1450
|
-
# @return [Array<Integer>] Array< Integer, 0 or 1 or 2 >
|
1451
|
-
#
|
1452
|
-
# [Integer] 対応する座標
|
1453
|
-
#
|
1454
|
-
# [0 or 1 or 2] 座標の進み(0 なら 没, 2 なら滅)
|
1455
|
-
#
|
1456
|
-
def position(date, delta=0)
|
1457
|
-
return super if date.most_significant_coordinate >= 1869
|
1458
|
-
date = date.floor
|
1459
|
-
p0, p1 = [date, date.succ].map {|d| (30.0 * @formula.time_to_cn(d-DoyoShift) - @margin + 12).floor}
|
1460
|
-
[p1 % @den, p1 - p0]
|
1461
|
-
end
|
1462
|
-
|
1463
|
-
#
|
1464
|
-
# イベント日付(時刻付)
|
1465
|
-
#
|
1466
|
-
# @private
|
1467
|
-
def event_time(date, event_name, event)
|
1468
|
-
return super if date.most_significant_coordinate >= 1869
|
1469
|
-
etime = term(date + When.Duration('P3D'), [-15,30], When::SYSTEM) + DoyoShift
|
1470
|
-
if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
|
1471
|
-
fraction = etime.clk_time.local_time
|
1472
|
-
fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
|
1473
|
-
fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
|
1474
|
-
fraction = fraction.to_i if fraction == fraction.to_i
|
1475
|
-
event_name + "(#{fraction}/#{formula.denominator})"
|
1476
|
-
else
|
1477
|
-
etime.events = [event_name]
|
1478
|
-
etime
|
1479
|
-
end
|
1480
|
-
end
|
1481
|
-
end
|
1482
|
-
end
|
1
|
+
# -*- coding: utf-8 -*-
|
2
|
+
=begin
|
3
|
+
Copyright (C) 2012-2014 Takashi SUGA
|
4
|
+
|
5
|
+
You may use and/or modify this file according to the license described in the LICENSE.txt file included in this archive.
|
6
|
+
=end
|
7
|
+
|
8
|
+
require 'when_exe/ephemeris/notes'
|
9
|
+
require 'when_exe/region/japanese/residues'
|
10
|
+
|
11
|
+
class When::CalendarNote
|
12
|
+
|
13
|
+
#
|
14
|
+
# 日本暦注
|
15
|
+
#
|
16
|
+
class Japanese < self
|
17
|
+
|
18
|
+
autoload :Eclipse, 'when_exe/region/japanese/eclipses'
|
19
|
+
|
20
|
+
#
|
21
|
+
# 日本暦注が使用する暦法
|
22
|
+
#
|
23
|
+
# @private
|
24
|
+
class Cal4Note
|
25
|
+
def initialize(calendar, solar)
|
26
|
+
@calendar = calendar
|
27
|
+
@solar = solar
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#
|
32
|
+
# 日本暦注の要素
|
33
|
+
#
|
34
|
+
# @private
|
35
|
+
class Note < When::CalendarNote::NoteElement
|
36
|
+
end
|
37
|
+
|
38
|
+
#
|
39
|
+
# 日本暦注の要素
|
40
|
+
#
|
41
|
+
Notes = [When::BasicTypes::M17n, [
|
42
|
+
"locale:[=ja:, en=en:]",
|
43
|
+
"names:[日本暦注=]",
|
44
|
+
|
45
|
+
# 年の暦注 ----------------------------
|
46
|
+
[When::BasicTypes::M17n,
|
47
|
+
"names:[年]",
|
48
|
+
[Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
|
49
|
+
# [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
|
50
|
+
# 'position:共通'], # 干
|
51
|
+
# [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
|
52
|
+
# 'position:共通'], # 支
|
53
|
+
[Note, 0x3800, "label:[廿八宿=ja:%%<二十八宿>]",
|
54
|
+
'position:共通'], # 1: 廿八宿
|
55
|
+
[Note, 0x3FFC, "label:[大歳壇=]", 'position:暦序'], # 2: 干支
|
56
|
+
[Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
|
57
|
+
[Note, 0xFFFC, "label:[納音]", 'position:暦序', 'suffix:是'], # 4: 干支
|
58
|
+
[Note, 0xFFFF, "label:[大歳=ja:%%<太歳神>]",
|
59
|
+
'position:暦序', 'suffix:在'], # 5: 干支
|
60
|
+
[Note, 0xFFFF, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
|
61
|
+
'position:暦序', 'suffix:在'], # 6: 支
|
62
|
+
[Note, 0xFFFF, "label:[大陰=ja:%%<太陰神>]",
|
63
|
+
'position:暦序', 'suffix:在'], # 7: 支
|
64
|
+
[Note, 0xFFFF, "label:[歳徳=ja:%%<歳徳神>]",
|
65
|
+
'position:暦序', 'suffix:在'], # 8: 干
|
66
|
+
[Note, 0xFFFF, "label:[歳刑=ja:%%<歳刑神>]",
|
67
|
+
'position:暦序', 'suffix:在'], # 9: 支
|
68
|
+
[Note, 0xFFFF, "label:[歳破=ja:%%<歳破神>]",
|
69
|
+
'position:暦序', 'suffix:在'], # 10: 支
|
70
|
+
[Note, 0xFFFF, "label:[歳煞=ja:%%<歳殺神>]",
|
71
|
+
'position:暦序', 'suffix:在'], # 11: 支
|
72
|
+
[Note, 0xFFFF, "label:[黄幡=ja:%%<黄幡神>]",
|
73
|
+
'position:暦序', 'suffix:在'], # 12: 支
|
74
|
+
[Note, 0xFFFF, "label:[豹尾=ja:%%<豹尾神>]",
|
75
|
+
'position:暦序', 'suffix:在'], # 13: 支
|
76
|
+
[Note, 0x0003, "label:[天道=]", 'position:暦序', 'suffix:-'], # 14: 支
|
77
|
+
[Note, 0x0003, "label:[人道=]", 'position:暦序', 'suffix:-'], # 15: 支
|
78
|
+
[Note, 0x3FFC, "label:[歳次=]", 'position:暦序', 'suffix:-'], # 16: 支
|
79
|
+
[Note, 0xF800, "label:[金神]", 'position:仮名暦', 'suffix:在'], # 17: 干
|
80
|
+
[Note, 0xFFFF, "label:[大小]", 'position:暦序'] # 18: 朔閏表
|
81
|
+
],
|
82
|
+
|
83
|
+
# 月の暦注 ----------------------------
|
84
|
+
[When::BasicTypes::M17n,
|
85
|
+
"names:[月]",
|
86
|
+
[Note, 0xFFFF, "label:[月名=ja:%%<月_(暦)>#%.<日本の和風月名>, Month]",
|
87
|
+
'position:月建'], # 0: 月の和名
|
88
|
+
# [Note, 0xFFFF, "label:[干支]", 'position:共通'], # 干支
|
89
|
+
# [Note, 0xFFFF, "label:[干=ja:%%<十干>]",
|
90
|
+
# 'position:共通'], # 干
|
91
|
+
# [Note, 0xFFFF, "label:[支=ja:%%<十二支>]",
|
92
|
+
# 'position:共通'], # 支
|
93
|
+
[Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
|
94
|
+
'position:共通'], # 1: 廿八宿
|
95
|
+
[Note, 0xFFFC, "label:[月建=]", 'position:月建', 'suffix:-' ], # 2: 年の十干と暦月
|
96
|
+
[Note, 0xC000, "label:[九星]", 'position:民間'], # 3: 九星
|
97
|
+
[Note, 0x0003, "label:[天氣=]", 'position:月建', 'suffix:-' ], # 4: 暦月
|
98
|
+
[Note, 0x3FFF, "label:[天道=]", 'position:月建', 'suffix:-' ], # 5: 暦月
|
99
|
+
[Note, 0x0003, "label:[人道=]", 'position:月建', 'suffix:-' ], # 6: 暦月
|
100
|
+
[Note, 0x0003, "label:[月破=]", 'position:月建', 'suffix:在'], # 7: 暦月
|
101
|
+
[Note, 0x3FFC, "label:[天徳=]", 'position:月建', 'suffix:在'], # 8: 暦月
|
102
|
+
[Note, 0x3FFF, "label:[月煞=]", 'position:月建', 'suffix:在'], # 9: 暦月
|
103
|
+
[Note, 0x3FFF, "label:[用時=]", 'position:月建', 'suffix:-' ], # 10: 暦月
|
104
|
+
[Note, 0x3FFF, "label:[月徳=]", 'position:月建', 'suffix:在'], # 11: 暦月
|
105
|
+
[Note, 0x3FFC, "label:[月徳合=]", 'position:月建', 'suffix:在'], # 12: 暦月
|
106
|
+
[Note, 0x3FFC, "label:[月空=]", 'position:月建', 'suffix:在'], # 13: 暦月
|
107
|
+
[Note, 0x3FFF, "label:[三鏡=]", 'position:月建', 'suffix:-' ], # 14: 暦月
|
108
|
+
[Note, 0x3FFF, "label:[土府=]", 'position:月建', 'suffix:在'], # 15: 暦月
|
109
|
+
[Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
|
110
|
+
'position:月建', 'suffix:在'], # 16: 暦月
|
111
|
+
[Note, 0xFFFF, "label:[大小]", 'position:月建'] # 17: 朔閏表
|
112
|
+
],
|
113
|
+
|
114
|
+
# 日の暦注 ----------------------------
|
115
|
+
[When::BasicTypes::M17n,
|
116
|
+
"names:[日]",
|
117
|
+
[Note, 0xFFFF, "label:[干支]", 'position:共通'], # 0: 干支
|
118
|
+
# [Note, 0x, "label:[干=ja:%%<十干>]",
|
119
|
+
# 'position:共通'], # 干
|
120
|
+
# [Note, 0x, "label:[支=ja:%%<十二支>]",
|
121
|
+
# 'position:共通'], # 支
|
122
|
+
[Note, 0x3FFF, "label:[納音]", 'position:共通', 'suffix:是'], # 1: 干支
|
123
|
+
[Note, 0xFFFF, "label:[十二直]", 'position:共通'], # 2: 支 節月
|
124
|
+
[Note, 0xFFFF, "label:[七曜]", 'position:共通'], # 3: 七曜
|
125
|
+
[Note, 0xF800, "label:[廿八宿=ja:%%<二十八宿>]",
|
126
|
+
'position:共通'], # 4: 廿八宿
|
127
|
+
[Note, 0x07F8, "label:[廿七宿=ja:%%<二十八宿>]",
|
128
|
+
'position:共通'], # 5: 暦月 暦日
|
129
|
+
[Note, 0xC000, "label:[九星]", 'position:民間'], # 6: 九星
|
130
|
+
[Note, 0x8000, "label:[六曜]", 'position:民間'], # 7: 暦月 暦日
|
131
|
+
[Note, 0xE000, "label:[祝祭日]", 'position:祝祭日'], # 8: 暦月 暦日 (七曜)
|
132
|
+
[Note, 0xFFFF, "label:[廿四節気=ja:%%<二十四節気>]",
|
133
|
+
'position:時候'], # 9: 太陽黄経
|
134
|
+
[Note, 0xFFFF, "label:[節中=]", 'position:時候'], # 10: 太陽黄経
|
135
|
+
[Note, 0xFFFC, "label:[七十二候]", 'position:時候'], # 11: 太陽黄経
|
136
|
+
[Note, 0x3FFC, "label:[六十卦=]", 'position:時候'], # 12: 太陽黄経
|
137
|
+
[Note, 0xF800, "label:[節分]", 'position:雑節'], # 13: 立春からの日数
|
138
|
+
[Note, 0xF800, "label:[初午]", 'position:雑節'], # 14: 支 節月 or 暦月
|
139
|
+
[Note, 0xF800, "label:[八十八夜]", 'position:雑節'], # 15: 立春からの日数
|
140
|
+
[Note, 0xF800, "label:[入梅]", 'position:雑節'], # 16: 干 太陽黄経
|
141
|
+
[Note, 0xF800, "label:[半夏生]", 'position:雑節'], # 17: 干 太陽黄経
|
142
|
+
[Note, 0xF800, "label:[二百十日]", 'position:雑節'], # 18: 立春からの日数
|
143
|
+
[Note, 0xF800, "label:[二百廿日=ja:%%<二百二十日>]", 'position:雑節'], # 19: 立春からの日数
|
144
|
+
|
145
|
+
[Note, 0x3FFC, "label:[大禍=ja:%%<暦注下段>#%.<大禍日>]",
|
146
|
+
'position:上段 上段 欄外 欄外', 'suffix:日'], # 20: 支 節月
|
147
|
+
[Note, 0x3FFC, "label:[滅門=ja:%%<暦注下段>#%.<滅門日>]",
|
148
|
+
'position:上段 上段 欄外 欄外', 'suffix:日'], # 21: 支 節月
|
149
|
+
[Note, 0x3FFC, "label:[狼藉=ja:%%<暦注下段>#%.<狼藉日>]",
|
150
|
+
'position:上段 上段 欄外 欄外', 'suffix:日'], # 22: 支 節月
|
151
|
+
|
152
|
+
[Note, 0x07F8, "label:[甘露=]", 'position:上段 上段 上段 上段', 'suffix:日'], # 23: 七曜 廿七宿
|
153
|
+
[Note, 0x07F8, "label:[金剛峯=]", 'position:上段 上段 上段 上段'], # 24: 七曜 廿七宿
|
154
|
+
[Note, 0x07F8, "label:[羅刹=]", 'position:上段 上段 上段 上段'], # 25: 七曜 廿七宿
|
155
|
+
|
156
|
+
[Note, 0x3FFC, "label:[大將軍=ja:%%<大将軍_(方位神)>]",
|
157
|
+
'position:上段 上段 上段 上段', 'suffix:-'], # 26: 干支 節年
|
158
|
+
[Note, 0xFFFC, "label:[天一=ja:%%<天一神>]",
|
159
|
+
'position:上段 上段 上段 上段', 'suffix:-'], # 27: 干支
|
160
|
+
[Note, 0x3FFC, "label:[土公=ja:%%<土公神>]",
|
161
|
+
'position:上段 上段 上段 上段', 'suffix:-'], # 28: 干支
|
162
|
+
[Note, 0x3FFC, "label:[歳下食=ja:%%<暦注下段>#%.<歳下食>]",
|
163
|
+
'position:上段 上段 上段 上段'], # 29: 干支 節年
|
164
|
+
[Note, 0x3FFC, "label:[忌遠行=]", 'position:上段 上段 上段 上段'], # 30: 支 節月
|
165
|
+
[Note, 0x3FFC, "label:[忌夜行=]", 'position:上段 上段 上段 上段'], # 31: 支 節月
|
166
|
+
[Note, 0x3FFC, "label:[下食時=ja:%%<暦注下段>#%.<時下食>]",
|
167
|
+
'position:上段 上段 上段 上段', 'suffix:-'], # 32: 支 節月 貞享暦で一部廃止
|
168
|
+
[Note, 0x3FFC, "label:[天間=]", 'position:上段 上段 上段 中段上'], # 33: 干支 節月
|
169
|
+
[Note, 0x3FFC, "label:[不視病=]", 'position:上段 上段 上段 上段'], # 34: 干
|
170
|
+
[Note, 0x3FFC, "label:[不問疾=]", 'position:上段 上段 上段 上段'], # 35: 干
|
171
|
+
[Note, 0x3FFC, "label:[不弔人=]", 'position:上段 上段 上段 上段'], # 36: 支
|
172
|
+
[Note, 0xFFFC, "label:[彼岸]", 'position:仮名暦'], # 37: 太陽黄経
|
173
|
+
[Note, 0xFFFF, "label:[社=ja:%%<社日>]",
|
174
|
+
'position:中段 中段 中段 中段', 'suffix:日'], # 38: 干 太陽黄経
|
175
|
+
[Note, 0xFFFF, "label:[三伏]", 'position:中段 中段 中段 中段'], # 39: 干 太陽黄経
|
176
|
+
[Note, 0x3FFC, "label:[除手足甲=]", 'position:中段 中段 中段 中段'], # 40: 晦(除手足甲)、支(片方のみ), 没滅凶会日×
|
177
|
+
[Note, 0x3FFC, "label:[沐浴=]", 'position:中段 中段 中段 中段'], # 41: 支 没滅凶会日×
|
178
|
+
[Note, 0x3FFD, "label:[臘=ja:%%<臘日>]",
|
179
|
+
'position:中段 中段 中段 中段', 'suffix:日'], # 42: 支 太陽黄経
|
180
|
+
[Note, 0x3FFC, "label:[伐=]", 'position:中段 中段 中段 中段上', 'suffix:日'], # 43: 干支
|
181
|
+
[Note, 0x3FFC, "label:[五墓=ja:%%<暦注下段>#%.<五墓日>]",
|
182
|
+
'position:中段 中段 中段 中段下', 'suffix:日'], # 44: 干支
|
183
|
+
[Note, 0x3FFC, "label:[六蛇=]", 'position:中段 中段 中段 中段上'], # 45: 干支 節月
|
184
|
+
[Note, 0x3FFC, "label:[七鳥=]", 'position:中段 中段 中段 中段上'], # 46: 干支 節月
|
185
|
+
[Note, 0x3FFC, "label:[八龍=]", 'position:中段 中段 中段 中段上'], # 47: 干支 節月
|
186
|
+
[Note, 0x3FFC, "label:[九虎=]", 'position:中段 中段 中段 中段上'], # 48: 干支 節月
|
187
|
+
[Note, 0x07FF, "label:[没=ja:%%<没日>]",
|
188
|
+
'position:中段 中段 中段 中段', 'suffix:日'], # 49: 太陽黄経
|
189
|
+
[Note, 0xFFF8, "label:[日食]", 'position:中段 中段 中段 中段'], # 50: 日食表
|
190
|
+
[Note, 0x07FC, "label:[滅=ja:%%<滅日>]",
|
191
|
+
'position:中段 中段 中段 中段', 'suffix:日'], # 51: 月の位相
|
192
|
+
[Note, 0xFFF8, "label:[月食]", 'position:中段 中段 中段 中段'], # 52: 月食表
|
193
|
+
[Note, 0xC7FD, "label:[月相]", 'position:中段 中段 中段 中段'], # 53: 月の位相
|
194
|
+
[Note, 0xFFFF, "label:[土用事=ja:%%<土用>]",
|
195
|
+
'position:中段 中段 中段 中段'], # 54: 太陽黄経
|
196
|
+
[Note, 0x3FF0, "label:[伏龍=]", 'position:上段 上段 下段 下段', 'suffix:在'], # 55: 太陽黄経
|
197
|
+
|
198
|
+
[Note, 0x3FFF, "label:[凶会=ja:%%<暦注下段>#%.<凶会日>]",
|
199
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 56: 干支 節月(宣明暦以前)/暦月(貞享暦以降)
|
200
|
+
[Note, 0x3FFF, "label:[大小歳=]", 'position:下段 下段 下段 下段'], # 57: 干支 節月
|
201
|
+
[Note, 0x3FFC, "label:[歳徳=ja:%%<歳徳神>]",
|
202
|
+
'position:下段 下段 下段 下段'], # 58: 干 節年 凶会日× ~合も
|
203
|
+
[Note, 0x0003, "label:[天倉=]", 'position:古注'], # 59: 干支 節月
|
204
|
+
# [Note, 0x0003, "label:[天李=]", 'position:古注'], # 干支 節月?
|
205
|
+
[Note, 0x37FF, "label:[天恩=ja:%%<暦注下段>#%.<天恩日>]",
|
206
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 60: 干支 節月 凶会日×
|
207
|
+
[Note, 0xFFFF, "label:[天赦=ja:%%<暦注下段>#%.<天赦日>]",
|
208
|
+
'position:下段 下段 下段 下段'], # 61: 干支 節月
|
209
|
+
[Note, 0x37FF, "label:[母倉=ja:%%<暦注下段>#%.<母倉日>]",
|
210
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 62: 支 節月 凶会日×
|
211
|
+
[Note, 0x37FC, "label:[月徳=]", 'position:下段 下段 下段 下段'], # 63: 干 節月 凶会日× ~合も
|
212
|
+
[Note, 0x3FFF, "label:[九坎=]", 'position:下段 下段 下段 下段'], # 64: 支 節月
|
213
|
+
[Note, 0x3FFF, "label:[歸忌=ja:%%<暦注下段>#%.<帰忌日>]",
|
214
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 65: 支 節月
|
215
|
+
[Note, 0x3FFF, "label:[血忌=ja:%%<暦注下段>#%.<血忌日>]",
|
216
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 66: 支 節月
|
217
|
+
[Note, 0x3FFC, "label:[無翹=]", 'position:下段 下段 下段 下段'], # 67: 支 節月
|
218
|
+
[Note, 0x3FFF, "label:[厭=]", 'position:下段 下段 下段 下段'], # 68: 支 節月
|
219
|
+
[Note, 0x3FFC, "label:[重=ja:%%<暦注下段>#%.<重日>]",
|
220
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 69: 支
|
221
|
+
[Note, 0x3FFD, "label:[復=ja:%%<暦注下段>#%.<復日>]",
|
222
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 70: 干 節月
|
223
|
+
[Note, 0x3FFC, "label:[月煞=]", 'position:下段 下段 下段 下段'], # 71: 支 節月
|
224
|
+
[Note, 0x3FFF, "label:[往亡=ja:%%<暦注下段>#%.<往亡日>]",
|
225
|
+
'position:下段 下段 下段 下段', 'suffix:日'], # 72: 太陽黄経
|
226
|
+
[Note, 0x3FFF, "label:[日遊=ja:%%<日遊神>]",
|
227
|
+
'position:最下段', 'suffix:在'], # 73: 干支
|
228
|
+
[Note, 0x07FF, "label:[人神配当=]", 'position:最下段孟月', 'suffix:-'], # 74: 暦日
|
229
|
+
|
230
|
+
[Note, 0x3E00, "label:[受死=ja:%%<暦注下段>#%.<受死日>]",
|
231
|
+
'position:仮名暦', 'suffix:日'], # 75: 支 節月
|
232
|
+
[Note, 0xFFF0, "label:[八專]", 'position:仮名暦'], # 76: 干支
|
233
|
+
[Note, 0x3E00, "label:[八專間日=ja:%%<八専>]",
|
234
|
+
'position:仮名暦'], # 77: 干支
|
235
|
+
[Note, 0xC000, "label:[金神間日=ja:%%<金神>#%.<金神の遊行・間日>]",
|
236
|
+
'position:仮名暦'], # 78: 支 節月
|
237
|
+
[Note, 0xC000, "label:[金神遊行=ja:%%<金神>#%.<金神の遊行・間日>]",
|
238
|
+
'position:仮名暦'], # 79: 支 節月
|
239
|
+
[Note, 0x3FF0, "label:[天火=ja:%%<暦注下段>#%.<天火日>]",
|
240
|
+
'position:仮名暦', 'suffix:日'], # 80: 支 節月
|
241
|
+
[Note, 0x3FF0, "label:[地火=ja:%%<暦注下段>#%.<地火日>]",
|
242
|
+
'position:仮名暦', 'suffix:日'], # 81: 支 節月
|
243
|
+
[Note, 0x3800, "label:[人火=]", 'position:仮名暦'], # 82: 支 節月
|
244
|
+
[Note, 0x3800, "label:[雷火=]", 'position:仮名暦'], # 83: 支 節月
|
245
|
+
[Note, 0x3FF0, "label:[赤舌=ja:%%<赤舌日>]",
|
246
|
+
'position:仮名暦', 'suffix:日'], # 84: 暦月 暦日
|
247
|
+
[Note, 0x3E00, "label:[十死=ja:%%<暦注下段>#%.<十死日>]",
|
248
|
+
'position:仮名暦', 'suffix:日'], # 85: 支 節月
|
249
|
+
[Note, 0x3E00, "label:[道虚=]", 'position:仮名暦', 'suffix:日'], # 86: 暦日
|
250
|
+
[Note, 0x3E00, "label:[大明=ja:%%<暦注下段>#%.<大明日>]",
|
251
|
+
'position:仮名暦', 'suffix:日'], # 87: 干支
|
252
|
+
[Note, 0x0600, "label:[大赤=ja:%%<赤口日>]",
|
253
|
+
'position:仮名暦', 'suffix:日'], # 88: 暦月 暦日
|
254
|
+
[Note, 0xF800, "label:[甲子待=ja:%%<甲子>]",
|
255
|
+
'position:仮名暦'], # 89: 干支
|
256
|
+
[Note, 0xC000, "label:[己巳]", 'position:仮名暦'], # 90: 干支
|
257
|
+
[Note, 0xF800, "label:[庚申待]", 'position:仮名暦'], # 91: 干支
|
258
|
+
[Note, 0x3800, "label:[犯土]", 'position:仮名暦'], # 92: 干支
|
259
|
+
[Note, 0xF800, "label:[十方暮]", 'position:仮名暦'], # 93: 干支
|
260
|
+
[Note, 0xF800, "label:[一粒万倍=ja:%%<一粒万倍日>]",
|
261
|
+
'position:仮名暦', 'suffix:日'], # 94: 支 節月
|
262
|
+
[Note, 0x3800, "label:[天福=]", 'position:仮名暦'], # 95: 支 節月
|
263
|
+
[Note, 0x3800, "label:[地福=]", 'position:仮名暦'], # 96: 支 節月
|
264
|
+
[Note, 0x3800, "label:[地五福=]", 'position:仮名暦'], # 97: 支 節月
|
265
|
+
[Note, 0xB800, "label:[三隣亡]", 'position:仮名暦'], # 98: 支 節月
|
266
|
+
[Note, 0xF800, "label:[不成就=ja:%%<不成就日>]",
|
267
|
+
'position:仮名暦', 'suffix:日'], # 99: 暦月 暦日/晦日
|
268
|
+
[Note, 0x3800, "label:[鬼宿]", 'position:仮名暦'], #100: 廿八宿
|
269
|
+
[Note, 0x3800, "label:[金性=]", 'position:仮名暦'], #101: 支 節月 支 節年
|
270
|
+
[Note, 0x3FFF, "label:[三寶吉=http://kotobank.jp/word/%%<三宝吉日>]",
|
271
|
+
'position:上段 上段 上段 上段'], #102: 干支 節月
|
272
|
+
[Note, 0x3FFF, "label:[神吉=ja:%%<暦注下段>#%.<神吉日>]",
|
273
|
+
'position:上段 上段 中段 中段上', 'suffix:日'], #103: 干支 節月
|
274
|
+
[Note, 0x3FFF, "label:[雑事吉=]", 'position:雑事吉'], #104: 干支 節月
|
275
|
+
[Note, 0x3FFF, "label:[小字注=]", 'position:下段小字 下段小字 下段小字 下段小字'],#105: 干支 節月
|
276
|
+
]
|
277
|
+
]]
|
278
|
+
|
279
|
+
#
|
280
|
+
# 日本暦注の時代変遷
|
281
|
+
#
|
282
|
+
# @private
|
283
|
+
NoteTypes = (2...When::TM::CalendarEra::JapaneseSolar[2].size).to_a.map {|i|
|
284
|
+
calendars =
|
285
|
+
[When::TM::CalendarEra::JapaneseLuniSolar[2][i][2],
|
286
|
+
When::TM::CalendarEra::JapaneseSolar[2][i][2]].map {|epoch|
|
287
|
+
epoch =~ /\A(-?\d+)-(\d+)-(\d+)\^(.+)\z/
|
288
|
+
$4
|
289
|
+
}
|
290
|
+
[$2 == '01' ? $1.to_i : $1.to_i+1, Cal4Note.new(*calendars)]
|
291
|
+
}.reverse
|
292
|
+
|
293
|
+
# @private
|
294
|
+
NoteRange = [
|
295
|
+
# 開始 具注暦 七十二候 index mask
|
296
|
+
[-660, 0, 0], # ~ 696 0 : 0001
|
297
|
+
[ 697, 0, 0], # ~ 763 1 : 0002
|
298
|
+
[ 764, 0, 2], # ~ 800 2 : 0004
|
299
|
+
[ 801, 0, 2], # ~ 900 3 : 0008
|
300
|
+
[ 901, 0, 2], # ~1003 4 : 0010
|
301
|
+
[1004, 1, 2], # ~1047 5 : 0020
|
302
|
+
[1048, 1, 2], # ~1100 6 : 0040
|
303
|
+
[1101, 1, 2], # ~1184 7 : 0080
|
304
|
+
[1185, 2, 2], # ~1300 8 : 0100
|
305
|
+
[1301, 2, 2], # ~1337 9 : 0200
|
306
|
+
[1338, 3, 2], # ~1684 10 : 0400
|
307
|
+
[1685, 3, 3], # ~1754 11 : 0800
|
308
|
+
[1755, 3, 4], # ~1867 12 : 1000
|
309
|
+
[1868, 3, 4], # ~1872 13 : 2000
|
310
|
+
[1873, 3, 4], # ~1873 14 : 4000
|
311
|
+
[1874, 3, 5] # ~ 15 : 8000
|
312
|
+
]
|
313
|
+
|
314
|
+
# @private
|
315
|
+
NoteFocused = (0...NoteRange.size).to_a.map {|range|
|
316
|
+
(2..4).to_a.map {|cord|
|
317
|
+
notes = Notes[1][cord]
|
318
|
+
(2...notes.size).to_a.inject([]) {|focused,note|
|
319
|
+
focused << notes[note][2][/\[.+?[=\]]/][1..-2] if notes[note][1][range] == 1
|
320
|
+
focused
|
321
|
+
}
|
322
|
+
}
|
323
|
+
}
|
324
|
+
|
325
|
+
#
|
326
|
+
# 月の大小
|
327
|
+
#
|
328
|
+
# @private
|
329
|
+
MonthPattern = {
|
330
|
+
29 => '小',
|
331
|
+
30 => '大',
|
332
|
+
-28 => '平',
|
333
|
+
-29 => '閏',
|
334
|
+
-30 => '小',
|
335
|
+
-31 => '大'
|
336
|
+
}
|
337
|
+
|
338
|
+
#
|
339
|
+
# 日本暦注に対応するインデックス(整数値)
|
340
|
+
#
|
341
|
+
# @private
|
342
|
+
module Index
|
343
|
+
# @private
|
344
|
+
[[2,'Y'], [3,'M'], [4,'D']].map {|cord|
|
345
|
+
index, initial = cord
|
346
|
+
notes = Notes[1][index]
|
347
|
+
(notes.size-2).times {|no|
|
348
|
+
name = initial + notes[no+2][2][/\[.+?[=\]]/][1..-2]
|
349
|
+
mask = 'M' + name
|
350
|
+
const_set(name, no)
|
351
|
+
const_set(mask, 1<<no)
|
352
|
+
}
|
353
|
+
}
|
354
|
+
end
|
355
|
+
|
356
|
+
#
|
357
|
+
# 日本暦注が使用する暦法
|
358
|
+
#
|
359
|
+
# @private
|
360
|
+
class Cal4Note
|
361
|
+
attr_reader :calendar, :solar
|
362
|
+
|
363
|
+
def l_calendar
|
364
|
+
@l_calendar ||= When.Calendar(@calendar.kind_of?(String) ? @calendar.sub(/#\{\?.+?\}/, '') : @calendar)
|
365
|
+
end
|
366
|
+
|
367
|
+
def s_calendar
|
368
|
+
@s_calendar ||= When.Calendar(@solar.kind_of?(String) ? @solar.sub(/#\{\?.+?\}/, '?Clock=THS') : @solar)
|
369
|
+
end
|
370
|
+
|
371
|
+
def l_phases
|
372
|
+
@l_phases ||= Japanese::LunarPhases.new('formula'=>l_calendar.formula[-1])
|
373
|
+
end
|
374
|
+
|
375
|
+
def s_terms
|
376
|
+
@s_terms ||= Japanese::SolarTerms.new('formula'=>s_calendar.formula[0])
|
377
|
+
end
|
378
|
+
|
379
|
+
def s_terms2
|
380
|
+
@s_terms2 ||= @l_calendar.iri =~ /JapaneseTwin(.*?)::天保暦/ ?
|
381
|
+
Japanese::SolarTermsRevised.new('formula'=>s_calendar.formula[0]) : s_terms
|
382
|
+
end
|
383
|
+
|
384
|
+
def doyo
|
385
|
+
@doyo ||= (s_calendar.doyo ? s_calendar.doyo * 360.0 / s_calendar.formula[0].year_length : 0)
|
386
|
+
end
|
387
|
+
end
|
388
|
+
|
389
|
+
#
|
390
|
+
# 日本暦注用の Notes の要素のための内部クラス
|
391
|
+
#
|
392
|
+
# @private
|
393
|
+
class Note
|
394
|
+
|
395
|
+
attr_reader :label, :position, :suffix
|
396
|
+
|
397
|
+
def to_note_hash(note, dates=nil)
|
398
|
+
{
|
399
|
+
:note => self,
|
400
|
+
:value => case @suffix
|
401
|
+
when '是' ; [@label + '是-', note[/.\z/]]
|
402
|
+
when '在' ; [@label + '在-', note]
|
403
|
+
when '-' ; [@label + '-', note]
|
404
|
+
else ; note
|
405
|
+
end,
|
406
|
+
:position => @position[@position.size == 1 ? 0 : dates.index_g]
|
407
|
+
}
|
408
|
+
end
|
409
|
+
|
410
|
+
private
|
411
|
+
# オブジェクトの正規化
|
412
|
+
#
|
413
|
+
def _normalize(args=[], options={})
|
414
|
+
@position = @position.split(/ /)
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
#
|
419
|
+
# 日本暦注計算に必要となる暦日や暦法をまとめた内部クラス
|
420
|
+
#
|
421
|
+
# @private
|
422
|
+
class Dates
|
423
|
+
|
424
|
+
attr_reader :year, :precision, :cal4note, :range, :index_g, :index_s, :o_date, :l_date, :m_date, :s_date
|
425
|
+
|
426
|
+
# 初期設定
|
427
|
+
def initialize(date, year=date.most_significant_coordinate, precision=date.precision, cal4note=nil)
|
428
|
+
|
429
|
+
# 暦注パターン
|
430
|
+
if cal4note
|
431
|
+
# 年代による判定
|
432
|
+
(1...NoteRange.size).to_a.reverse.each do |i|
|
433
|
+
if year >= NoteRange[i][0]
|
434
|
+
@range = i
|
435
|
+
break
|
436
|
+
end
|
437
|
+
end
|
438
|
+
@range ||= 0
|
439
|
+
else
|
440
|
+
# 暦法による判定
|
441
|
+
cal4note = Cal4Note.new(date.frame, date.frame.twin)
|
442
|
+
@range =
|
443
|
+
case cal4note.l_calendar.formula[-1]
|
444
|
+
when When::Ephemeris::ChineseTrueLunation::JujiMethods ; 11 # 江戸時代の暦
|
445
|
+
when When::Ephemeris::ChineseTrueLunation
|
446
|
+
date.frame.twin =~ /戊寅|麟徳/ ? 1 : 10 # 唐代定朔暦(儀鳳暦 or 宣明暦)
|
447
|
+
when When::Ephemeris::MeanLunation ; 0 # 唐代以前平朔暦(元嘉暦)
|
448
|
+
else ; 15 # 現代の旧暦
|
449
|
+
end
|
450
|
+
end
|
451
|
+
|
452
|
+
# 具注暦の配置
|
453
|
+
@index_g = NoteRange[@range][1]
|
454
|
+
|
455
|
+
# 七十二候
|
456
|
+
@index_s = NoteRange[@range][2]
|
457
|
+
|
458
|
+
# その他の属性
|
459
|
+
@year = year
|
460
|
+
@precision = precision
|
461
|
+
@cal4note = cal4note
|
462
|
+
@o_date = date
|
463
|
+
@l_date = @cal4note.l_calendar ^ date
|
464
|
+
@m_date = date.frame.kind_of?(When::CalendarTypes::Christian) ? @l_date : @o_date
|
465
|
+
@s_date = @cal4note.s_calendar ^ date
|
466
|
+
end
|
467
|
+
end
|
468
|
+
|
469
|
+
NoteMethods = [:year_notes, :month_notes, :day_notes]
|
470
|
+
|
471
|
+
# 暦注の計算
|
472
|
+
#
|
473
|
+
# @param [When::TM::TemporalPosition] date 暦注を計算する日時
|
474
|
+
# (date が When::TM::TemporalPosition でない場合、When::TM::TemporalPosition に変換して使用する)
|
475
|
+
# @param [Hash] options
|
476
|
+
# :indices, :notes およびその他のキー => {When::CalendarNote#notes} を参照
|
477
|
+
#
|
478
|
+
# @return [Hash] :notes が String の場合
|
479
|
+
# @return [Array<Hash>] 上記に該当せず、:indices が Integer の場合
|
480
|
+
# @return [Array<Array<Hash>>] 上記のいずれにも該当しない場合
|
481
|
+
# @note return 値の [Hash] の要素は下記の通り
|
482
|
+
# :note => 暦注要素 (When::CalendarTypes::Japanese::Note)
|
483
|
+
# :value => 暦注の値 (String or When::BasicTypes::M17n または、その Array)
|
484
|
+
# :position => 具注暦でのその暦注の配置場所(String)
|
485
|
+
#
|
486
|
+
def notes(date, options={})
|
487
|
+
dates, indices, notes, persistence, conditions, options = _parse_note(date, options)
|
488
|
+
NotesContainer.register(indices.map {|i|
|
489
|
+
next [] unless i <= dates.precision
|
490
|
+
send(NoteMethods[i-1], dates, notes[i-1], conditions)
|
491
|
+
}, persistence, date.to_i)
|
492
|
+
end
|
493
|
+
|
494
|
+
# 太陽の位置 => 日時
|
495
|
+
#
|
496
|
+
# @param [When::TM::TemporalPosition] date 探す基準とする日時
|
497
|
+
# @param [Array<Numeric>] parameter 太陽の位置の分子と分母( num, den)
|
498
|
+
#
|
499
|
+
# num 分子 (デフォルト 0 : 基準日時直後の春分)
|
500
|
+
#
|
501
|
+
# den 分母 (デフォルト 360 : 検索範囲の長さ)
|
502
|
+
#
|
503
|
+
# @param [String] parameter 太陽の位置の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(春分))
|
504
|
+
# @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
|
505
|
+
#
|
506
|
+
# @return [When::TM::CalDate] date またはその直後に太陽の位置が指定の値になる日時
|
507
|
+
#
|
508
|
+
def term(date, parameter=nil, precision=date.precision)
|
509
|
+
dates = _to_date_for_note(date)
|
510
|
+
result = dates.cal4note.s_terms.term(date, parameter)
|
511
|
+
patch = SolarTerms::Patch[result.to_i]
|
512
|
+
return result unless patch
|
513
|
+
num, den = parameter.kind_of?(String) ? parameter.split('/', 2) : parameter
|
514
|
+
num = (num || 0).to_f
|
515
|
+
den = (den || 360).to_f
|
516
|
+
diff = (num - patch[0] + 1) % den - 1
|
517
|
+
return result if diff == 0
|
518
|
+
patched = result + When::P1D * diff
|
519
|
+
result.cal_date[0..-2] = patched.cal_date[0..-2]
|
520
|
+
result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
|
521
|
+
result
|
522
|
+
end
|
523
|
+
|
524
|
+
# 月の位相 => 日時
|
525
|
+
#
|
526
|
+
# @param [When::TM::TemporalPosition] date 探す基準とする日時
|
527
|
+
# @param [Array<Numeric>] parameter 月の位相の分子と分母( num, den)
|
528
|
+
#
|
529
|
+
# num 分子 (デフォルト 0 : 基準日時直後の朔)
|
530
|
+
#
|
531
|
+
# den 分母 (デフォルト 30 : 検索範囲の長さ)
|
532
|
+
#
|
533
|
+
# @param [String] parameter 月の位相の分子と分母("#{ num }/#{ den }" の形式, デフォルト 0(朔))
|
534
|
+
# @param [Integer] precision 取得したい時間位置の分解能(デフォルト date の分解能)
|
535
|
+
#
|
536
|
+
# @return [When::TM::CalDate] date またはその直後に月の位相が指定の値になる日時
|
537
|
+
#
|
538
|
+
def phase(date, parameter=nil, precision=date.precision)
|
539
|
+
dates = _to_date_for_note(date)
|
540
|
+
note = dates.cal4note.l_phases
|
541
|
+
result = note.phase(date, parameter)
|
542
|
+
return result if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
543
|
+
|
544
|
+
time = note.phase(date, parameter, When::SYSTEM)
|
545
|
+
cn = note.formula.time_to_cn(time) % 1
|
546
|
+
case cn
|
547
|
+
when 0..0.0001, 0.9999..1 # 朔
|
548
|
+
return result if result.cal_date[-1] == 1
|
549
|
+
diff = result.cal_date[-1] < 15 ? -1 : +1
|
550
|
+
when 0.2..0.8 # 弦、望
|
551
|
+
return result unless note.formula.kind_of?(When::Ephemeris::ChineseTrueLunation)
|
552
|
+
return result if time.clk_time.universal_time >= When::TM::Duration::DAY/4 # 午前6時以降
|
553
|
+
diff = -1
|
554
|
+
else # その他
|
555
|
+
return result
|
556
|
+
end
|
557
|
+
|
558
|
+
patched = result + When::P1D * diff
|
559
|
+
result.cal_date[0..-2] = patched.cal_date[0..-2]
|
560
|
+
result.cal_date[-1] = When::Coordinates::Pair.new(patched.cal_date[-1], -diff)
|
561
|
+
result
|
562
|
+
end
|
563
|
+
|
564
|
+
private
|
565
|
+
|
566
|
+
# オブジェクトの正規化
|
567
|
+
def _normalize(args=[], options={})
|
568
|
+
@prime ||= [%w(干支), %w(月名), %w(七曜 干支 六曜 廿四節気 祝祭日)]
|
569
|
+
super
|
570
|
+
end
|
571
|
+
|
572
|
+
# 年の暦注
|
573
|
+
def year_notes(dates, notes, conditions={})
|
574
|
+
_note_values(dates, notes, _all_keys[-3], _elements[-3]) do |dates, focused_notes, notes_hash|
|
575
|
+
|
576
|
+
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-3]
|
577
|
+
root = When.Resource('_co:Common')
|
578
|
+
|
579
|
+
# 干支
|
580
|
+
residue = (dates.precision < When::DAY ? dates.o_date : dates.s_date).most_significant_coordinate - 4
|
581
|
+
notes_hash['干支'] = root['干支'][residue % 60]
|
582
|
+
notes_hash['干'] = root['干' ][residue % 10]
|
583
|
+
notes_hash['支'] = root['支' ][residue % 12]
|
584
|
+
|
585
|
+
# 廿八宿
|
586
|
+
notes_hash['廿八宿'] ||= root['宿'][(residue+18) % 28]
|
587
|
+
|
588
|
+
# 九星
|
589
|
+
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.year(residue)]
|
590
|
+
|
591
|
+
# 大小
|
592
|
+
unless notes_hash['大小']
|
593
|
+
year = dates.o_date.floor(When::YEAR)
|
594
|
+
month = year.floor(When::MONTH)
|
595
|
+
pattern = ''
|
596
|
+
while year == month
|
597
|
+
length = month.length(When::MONTH)
|
598
|
+
length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
|
599
|
+
pattern += '閏' if month[When::MONTH] * 0 == 1
|
600
|
+
pattern += MonthPattern[length] || '改'
|
601
|
+
month += When::P1M
|
602
|
+
end
|
603
|
+
notes_hash['大小'] = "#{pattern}(#{year.length(When::YEAR)})"
|
604
|
+
end
|
605
|
+
|
606
|
+
# その他
|
607
|
+
[notes_hash['干支'], notes_hash['干'], notes_hash['支']].each do |note|
|
608
|
+
note._year_notes(notes_hash, dates, conditions)
|
609
|
+
end
|
610
|
+
notes_hash
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
# 月の暦注
|
615
|
+
def month_notes(dates, notes, conditions={})
|
616
|
+
_note_values(dates, notes, _all_keys[-2], _elements[-2]) do |dates, focused_notes, notes_hash|
|
617
|
+
|
618
|
+
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-2]
|
619
|
+
root = When.Resource('_co:Common')
|
620
|
+
|
621
|
+
# 干支
|
622
|
+
residue = month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.m_date)
|
623
|
+
notes_hash['干支'] = root['干支'][residue % 60]
|
624
|
+
notes_hash['干'] = root['干' ][residue % 10]
|
625
|
+
notes_hash['支'] = root['支' ][residue % 12]
|
626
|
+
|
627
|
+
# 廿八宿
|
628
|
+
notes_hash['廿八宿'] ||= root['宿'][(residue+6) % 28]
|
629
|
+
|
630
|
+
# 九星
|
631
|
+
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.month(
|
632
|
+
month_stem_branch(dates.precision < When::DAY ? dates.o_date : dates.s_date))]
|
633
|
+
|
634
|
+
# 大小
|
635
|
+
unless notes_hash['大小']
|
636
|
+
length = dates.o_date.length(When::MONTH)
|
637
|
+
length = -length if dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) # 太陽暦
|
638
|
+
notes_hash['大小'] = "#{dates.o_date[When::MONTH]*0==1 ? '閏' : ''}#{MonthPattern[length] || '改'}(#{length.abs})"
|
639
|
+
end
|
640
|
+
|
641
|
+
# その他
|
642
|
+
[notes_hash['干支'], notes_hash['干'], notes_hash['支'], JapaneseLuniSolarNote].each do |note|
|
643
|
+
note._month_notes(notes_hash, dates, conditions)
|
644
|
+
end
|
645
|
+
notes_hash
|
646
|
+
end
|
647
|
+
end
|
648
|
+
|
649
|
+
# 日の暦注
|
650
|
+
def day_notes(dates, notes, conditions={})
|
651
|
+
_note_values(dates, notes, _all_keys[-1], _elements[-1]) do |dates, focused_notes, notes_hash|
|
652
|
+
|
653
|
+
focused_notes[0..-1] = focused_notes & NoteFocused[dates.range][-1]
|
654
|
+
root = When.Resource('_co:Common')
|
655
|
+
|
656
|
+
# 干支
|
657
|
+
residue = dates.s_date.to_i-11
|
658
|
+
notes_hash['干支'] = root['干支'][residue % 60]
|
659
|
+
notes_hash['干'] = root['干' ][residue % 10]
|
660
|
+
notes_hash['支'] = root['支' ][residue % 12]
|
661
|
+
|
662
|
+
# その他
|
663
|
+
[SolarTerms, LunarPhases, notes_hash['干支'], notes_hash['干'], notes_hash['支'],
|
664
|
+
JapaneseLuniSolarNote, JapaneseSolarNote].each do |note|
|
665
|
+
note._day_notes(notes_hash, dates, conditions)
|
666
|
+
end
|
667
|
+
|
668
|
+
# 七曜
|
669
|
+
notes_hash['七曜'] ||= root['Week'][dates.s_date.to_i % 7]
|
670
|
+
|
671
|
+
# 廿七宿
|
672
|
+
notes_hash['廿七宿'] = _residue27(notes_hash['廿七宿'], root)
|
673
|
+
|
674
|
+
# 廿八宿 / 鬼宿
|
675
|
+
notes_hash['廿八宿'] ||= root['宿'][(dates.s_date.to_i+11) % 28]
|
676
|
+
notes_hash['鬼宿'] ||= /鬼/ =~ notes_hash['廿八宿'].to_s ? '鬼宿' : nil
|
677
|
+
|
678
|
+
# 九星
|
679
|
+
notes_hash['九星'] ||= root['九星'][When::Coordinates::Kyusei.day(dates.s_date, dates.cal4note.s_terms)]
|
680
|
+
|
681
|
+
notes_hash
|
682
|
+
end
|
683
|
+
end
|
684
|
+
|
685
|
+
#
|
686
|
+
# 日本暦日情報オブジェクトの生成
|
687
|
+
#
|
688
|
+
# @note 対となる太陽暦のある太陰太陽暦はそのまま(太陰太陽暦,太陽暦)の対
|
689
|
+
# そうでなければ、採用する対を年代により選択する
|
690
|
+
#
|
691
|
+
def _to_date_for_note(date)
|
692
|
+
if date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
|
693
|
+
return Dates.new(date) if date.frame.twin
|
694
|
+
o_date = date
|
695
|
+
else
|
696
|
+
o_date = self.class._to_japanese_date(date)
|
697
|
+
return nil unless o_date
|
698
|
+
end
|
699
|
+
year = o_date.most_significant_coordinate
|
700
|
+
NoteTypes.each do |line|
|
701
|
+
return Dates.new(o_date, year, date.precision, line[1]) if year >= line[0]
|
702
|
+
end
|
703
|
+
nil
|
704
|
+
end
|
705
|
+
|
706
|
+
#
|
707
|
+
# 任意の暦を日本年号付暦日に変換
|
708
|
+
#
|
709
|
+
def self._to_japanese_date(date)
|
710
|
+
return date if date._attr[:query] && date._attr[:query]['area'].to_s =~ /日本/
|
711
|
+
(date^ When.era(:area=>'日本')).each do |list|
|
712
|
+
return list[0] if list[0]
|
713
|
+
end
|
714
|
+
nil
|
715
|
+
end
|
716
|
+
|
717
|
+
#
|
718
|
+
# 廿七宿を Resudue 化
|
719
|
+
#
|
720
|
+
def _residue27(index, root)
|
721
|
+
return index unless index.kind_of?(Integer)
|
722
|
+
root['宿'][index]
|
723
|
+
end
|
724
|
+
|
725
|
+
#
|
726
|
+
# 月の干支
|
727
|
+
#
|
728
|
+
def month_stem_branch(date)
|
729
|
+
date.most_significant_coordinate*12+(date.cal_date[1] * 1) +
|
730
|
+
(date.frame.kind_of?(When::CalendarTypes::Christian) ? 12 : 13)
|
731
|
+
end
|
732
|
+
end
|
733
|
+
|
734
|
+
#
|
735
|
+
# 太陽暦の暦注・祝祭日
|
736
|
+
#
|
737
|
+
class JapaneseSolarNote < self
|
738
|
+
|
739
|
+
#
|
740
|
+
# 祝祭日一覧
|
741
|
+
#
|
742
|
+
NotesList = {
|
743
|
+
[ 1, 1] => [[1868..1872, '元旦'], [1874..1948, '四方拝'], [1949..2100, '元日']],
|
744
|
+
[ 1, 3] => [[1874..1948, '元始祭']],
|
745
|
+
[ 1, 5] => [[1874..1948, '新年宴会']],
|
746
|
+
[ 1,-2] => [[2000..2100, '成人の日']],
|
747
|
+
[ 1,15] => [[1868..1872, '小正月'], [1949..1999, '成人の日']],
|
748
|
+
[ 1,29] => [[1873..1873, '神武天皇即位日']],
|
749
|
+
[ 1,30] => [[1874..1912, '孝明天皇祭']],
|
750
|
+
[ 2,11] => [[1874..1948, '紀元節'], [1967..2100, '建国記念の日']],
|
751
|
+
[ 2,24] => [[1989..1989, '昭和天皇の大喪の礼']],
|
752
|
+
[ 3, 3] => [[1868..1872, '弥生節句']],
|
753
|
+
[ 3, 0] => [[1879..1948, '春季皇霊祭'], [1949..2100, '春分の日']],
|
754
|
+
[ 4, 3] => [[1874..1948, '神武天皇祭']],
|
755
|
+
[ 4,10] => [[1959..1959, '皇太子明仁親王の結婚の儀']],
|
756
|
+
[ 4,29] => [[1927..1948, '天長節'], [1949..1988, '天皇誕生日'], [1989..2006, 'みどりの日'], [2007..2100, '昭和の日']],
|
757
|
+
[ 5, 3] => [[1949..2100, '憲法記念日']],
|
758
|
+
[ 5, 4] => [[2007..2100, 'みどりの日']],
|
759
|
+
[ 5, 5] => [[1868..1872, '端午節句'], [1949..2100, 'こどもの日']],
|
760
|
+
[ 6, 9] => [[1993..1993, '皇太子徳仁親王の結婚の儀']],
|
761
|
+
[ 7, 7] => [[1868..1872, '七夕節句']],
|
762
|
+
[ 7,15] => [[1868..1872, 'お盆']],
|
763
|
+
[ 7,20] => [[1996..2002, '海の日']],
|
764
|
+
[ 7,-3] => [[2003..2100, '海の日']],
|
765
|
+
[ 7,30] => [[1913..1926, '明治天皇祭']],
|
766
|
+
[ 8, 1] => [[1868..1872, '田実節句']],
|
767
|
+
[ 8,11] => [[2016..2100, '山の日']],
|
768
|
+
[ 8,31] => [[1913..1926, '天長節']],
|
769
|
+
[ 9, 9] => [[1868..1872, '重陽節句']],
|
770
|
+
[ 9,15] => [[1966..2002, '敬老の日']],
|
771
|
+
[ 9,-3] => [[2003..2100, '敬老の日']],
|
772
|
+
[ 9,17] => [[1874..1878, '神嘗祭']],
|
773
|
+
[ 9, 0] => [[1878..1947, '秋季皇霊祭'], [1948..2100, '秋分の日']],
|
774
|
+
[10,10] => [[1966..1999, '体育の日']],
|
775
|
+
[10,-2] => [[2000..2100, '体育の日']],
|
776
|
+
[10,17] => [[1879..1947, '神嘗祭']],
|
777
|
+
[10,31] => [[1913..1926, '天長節祝日']],
|
778
|
+
[11, 3] => [[1873..1911, '天長節'], [1927..1947, '明治節'], [1948..2100, '文化の日']],
|
779
|
+
[11,10] => [[1915..1915, '即位の礼'], [1928..1928, '即位の礼']],
|
780
|
+
[11,12] => [[1990..1990, '即位の礼正殿の儀']],
|
781
|
+
[11,14] => [[1915..1915, '大嘗祭'], [1928..1928, '大嘗祭']],
|
782
|
+
[11,16] => [[1915..1915, '大饗第1日'], [1928..1928, '大饗第1日']],
|
783
|
+
[11,23] => [[1873..1947, '新嘗祭'], [1948..2100, '勤労感謝の日']],
|
784
|
+
[12,23] => [[1989..2100, '天皇誕生日']],
|
785
|
+
[12,25] => [[1927..1947, '大正天皇祭']]
|
786
|
+
}
|
787
|
+
|
788
|
+
# @private
|
789
|
+
Long = {3=>0, 9=>180}
|
790
|
+
|
791
|
+
class << self
|
792
|
+
|
793
|
+
# 日の暦注 - 祝祭日の計算
|
794
|
+
# @private
|
795
|
+
def _day_notes(notes, dates, conditions={})
|
796
|
+
# 明治維新以降の実暦日のみ扱う
|
797
|
+
return notes if dates.o_date.frame.kind_of?(When::CalendarTypes::ChineseLuniSolar)
|
798
|
+
year = dates.o_date.most_significant_coordinate
|
799
|
+
return notes unless year >= 1868
|
800
|
+
|
801
|
+
# 春分の日と秋分の日を祝祭日に加える
|
802
|
+
long = Long[dates.o_date.cal_date[1]] if year >= 1878
|
803
|
+
if long
|
804
|
+
date = When.when?(dates.o_date.to_cal_date.to_s,
|
805
|
+
{:frame=>dates.o_date.frame,
|
806
|
+
:clock=>dates.s_date.frame.time_basis})
|
807
|
+
term = dates.cal4note.s_terms.term(date.floor(When::MONTH,
|
808
|
+
When::DAY), [long,360]).cal_date[1..2]
|
809
|
+
list = NotesList.dup
|
810
|
+
list[term] = list[[term[0],0]]
|
811
|
+
else
|
812
|
+
list = NotesList
|
813
|
+
end
|
814
|
+
|
815
|
+
# 「国民の休日」制定以前
|
816
|
+
notes['祝祭日'] ||= _holiday(list, dates.o_date, '振替休日')
|
817
|
+
return notes if notes['祝祭日'] || year < 1988
|
818
|
+
|
819
|
+
# 「国民の休日」制定以後
|
820
|
+
duration = When.Duration('P1D')
|
821
|
+
[duration, -duration].each do |d|
|
822
|
+
return notes unless _holiday(list, dates.o_date + d)
|
823
|
+
end
|
824
|
+
notes['祝祭日'] = '国民の休日'
|
825
|
+
return notes
|
826
|
+
end
|
827
|
+
|
828
|
+
private
|
829
|
+
|
830
|
+
# 振替休日とハッピーマンデーを考慮した祝祭日
|
831
|
+
def _holiday(list, date, alternate=nil)
|
832
|
+
y = date.most_significant_coordinate
|
833
|
+
m, d = date.cal_date[1..2]
|
834
|
+
|
835
|
+
# 「振替休日」制定以前
|
836
|
+
note = _note(list, y, m, d)
|
837
|
+
return note if note || y < 1973
|
838
|
+
|
839
|
+
# 「振替休日」制定以降
|
840
|
+
case date.to_i % 7
|
841
|
+
when 0 # 月曜
|
842
|
+
# 振替休日
|
843
|
+
note = _note(list, y, m, d-1)
|
844
|
+
return alternate if note
|
845
|
+
# ハッピーマンデー
|
846
|
+
note = _note(list, y, m, -((d-1)/7 + 1))
|
847
|
+
return note if note
|
848
|
+
when 1,2 # 火曜・水曜
|
849
|
+
# 振替休日
|
850
|
+
return alternate if y >= 2007 && m == 5 && d == 6
|
851
|
+
end
|
852
|
+
end
|
853
|
+
|
854
|
+
# 振替休日とハッピーマンデーを考慮しない祝祭日
|
855
|
+
def _note(list, year, month, day)
|
856
|
+
return nil if day == 0
|
857
|
+
year = [year, 2100].min
|
858
|
+
note = list[[month,day]]
|
859
|
+
return nil unless note
|
860
|
+
note.each do |range|
|
861
|
+
return range[1] if range[0].include?(year)
|
862
|
+
end
|
863
|
+
return nil
|
864
|
+
end
|
865
|
+
end
|
866
|
+
end
|
867
|
+
|
868
|
+
#
|
869
|
+
# 太陰太陽暦の暦注
|
870
|
+
#
|
871
|
+
class JapaneseLuniSolarNote < self
|
872
|
+
|
873
|
+
# 変換表 月日→27宿
|
874
|
+
StarMansions = [ # 正 2 3 4 5 6 7 8 9 10 11 12
|
875
|
+
[11, 13, 15, 17, 19, 21, 24, 0, 2, 4, 7, 9], # 0 : 本月本説 室12奎14胃16畢18參20鬼22張25角00氐02心04斗07虛10
|
876
|
+
[ 5, 3, 1, 25, 23, 21, 19, 16, 14, 11, 8, 7], # 1 : 本月異説 尾05房03亢01翼26星24鬼22參20昴17婁15室12女09斗07
|
877
|
+
[14, 16, 18, 20, 22, 24, 0, 3, 5, 7, 10, 12], # 2 : 閏月本説 婁15昴17觜19井21柳23張25角00房03尾05斗07危11壁13
|
878
|
+
[12, 14, 16, 18, 19, 21, 24, 0, 2, 5, 8, 10], # 3 : 閏月異説 壁13婁15昴17觜19參20鬼22張25角00氐02尾05女09危11
|
879
|
+
[14, 16, 18, 23, 22, 24, 0, 3, 5, 7, 8, 12] # 4 : 閏月本説(元) (星24) (女09)
|
880
|
+
]
|
881
|
+
|
882
|
+
# 変換表 27宿→28宿
|
883
|
+
StarMansionIndex = (0..7).to_a + (9..27).to_a
|
884
|
+
|
885
|
+
# 七曜と27宿で決まる暦注
|
886
|
+
WeekDepended = {
|
887
|
+
# 日 月 火 水 木 金 土
|
888
|
+
'甘露' => [26, 17, 5, 22, 21, 3, 23], # 軫27 畢18 尾05 柳23 鬼22 房03 星24
|
889
|
+
'金剛峯' => [ 5, 8, 12, 16, 20, 24, 1], # 尾05 女09 壁13 昴17 井21 張25 亢01
|
890
|
+
'羅刹' => [15, 21, 25, 19, 2, 13, 22] # 胃16 鬼22 翼26 参20 氐02 奎14 柳23
|
891
|
+
}
|
892
|
+
|
893
|
+
# 人神配当
|
894
|
+
HumanBody = %w(足大指 外踝 股内 腰 口 手 内踝 腕 尻 腰背
|
895
|
+
鼻柱 髪際 牙歯 胃管 遍身 胸 気街 股内 足 踝
|
896
|
+
足小指 足踝及胸、目下 肝及足 手陽明 足陽明 胸 膝 陰 膝晊 足跌)
|
897
|
+
|
898
|
+
# 月の暦注
|
899
|
+
# @private
|
900
|
+
def self._month_notes(notes, dates, conditions={})
|
901
|
+
# 月名
|
902
|
+
notes['月名'] ||= dates.o_date.name('month')
|
903
|
+
end
|
904
|
+
|
905
|
+
# 日の暦注
|
906
|
+
# @private
|
907
|
+
def self._day_notes(notes, dates, conditions={})
|
908
|
+
|
909
|
+
# 廿七宿
|
910
|
+
m, l = [1,0].map {|f| dates.m_date.cal_date[1] * f}
|
911
|
+
d = (StarMansions[l==1 ? (conditions[:i27]||0) :
|
912
|
+
(conditions[:n27]||0)][m-1] + dates.m_date.cal_date[2] - 1) % 27
|
913
|
+
notes['廿七宿'] ||= StarMansionIndex[d]
|
914
|
+
|
915
|
+
# 甘露 / 金剛峯 / 羅刹
|
916
|
+
w = (dates.m_date.to_i + 1) % 7
|
917
|
+
['甘露', '金剛峯', '羅刹'].each do |c|
|
918
|
+
notes[c] = c if d == WeekDepended[c][w]
|
919
|
+
end
|
920
|
+
|
921
|
+
# 三寶吉・神吉・雑事吉・小字注 (凶会日は表引きの時点で抑制済み)
|
922
|
+
notes['神吉'] = notes['雑事吉'] = notes['三寶吉'] = notes['小字注'] = nil if notes['没'] || notes['滅']
|
923
|
+
notes['神吉'] = notes['雑事吉'] = nil if notes['往亡']
|
924
|
+
notes['神吉'] = notes['三寶吉'] = nil if notes['月食']
|
925
|
+
notes['小字注'] = nil if notes['日食'] || notes['月食']
|
926
|
+
notes['小字注'] = nil if notes['九坎'] && dates.range==5 # 11世紀後半
|
927
|
+
notes['三寶吉'] = nil if notes['羅刹']
|
928
|
+
notes['三寶吉'] = notes['甘露'] ? '三寶吉' : nil if /\+/ =~ notes['三寶吉'].to_s
|
929
|
+
notes['三寶吉'] = '三吉' if notes['三寶吉'] && dates.range >= 8 # 鎌倉以降
|
930
|
+
|
931
|
+
# 除手足甲 & 道虚・人神配当
|
932
|
+
y,m0,d0 = dates.m_date.cal_date
|
933
|
+
misoka = m0 != (dates.m_date + When.Duration('P1D')).cal_date[1] if d0 == 29
|
934
|
+
notes['除手足甲'] = '除手足甲' if ([6,16,30].include?(d0) || misoka) && !(conditions[:kana] || notes['没'] || notes['滅'] || notes['凶会'])
|
935
|
+
notes['道虚'] = '道虚' if d0 % 6 == 0 || misoka
|
936
|
+
notes['人神配当'] = HumanBody[d0-1]
|
937
|
+
|
938
|
+
# 仮名暦
|
939
|
+
notes['赤舌' ] ||= d0 == (m * 5 - 3) % 6 + 1 ? '赤舌' : nil
|
940
|
+
notes['大赤' ] ||= d0 % 8 == (m * 7 - 3) % 8 ? '大赤' : nil
|
941
|
+
notes['不成就'] ||= d0 % 8 == [6,3,2,1,4,5][m % 6] || (misoka && m % 6 == 0) ? '不成就' : nil # 『現代こよみ読み解き事典』 for 不成就日
|
942
|
+
notes['六曜' ] ||= When::RokuyoWeek.rokuyo_value(m, d0)
|
943
|
+
notes
|
944
|
+
end
|
945
|
+
end
|
946
|
+
|
947
|
+
#
|
948
|
+
# 月の位相による暦注
|
949
|
+
#
|
950
|
+
class Japanese::LunarPhases < LunarPhases
|
951
|
+
|
952
|
+
# 日の暦注
|
953
|
+
# @private
|
954
|
+
def self._day_notes(notes, dates, conditions={})
|
955
|
+
date = When.when?(dates.o_date.to_cal_date.to_s,
|
956
|
+
{:frame=>dates.o_date.frame,
|
957
|
+
:clock=>dates.l_date.frame.time_basis})
|
958
|
+
phase, metsu = dates.cal4note.l_phases.position(date)
|
959
|
+
|
960
|
+
# 滅
|
961
|
+
notes['滅'] = metsu == 2 && dates.range < 11 ? '滅' : nil
|
962
|
+
|
963
|
+
# 月相
|
964
|
+
unless notes['月相']
|
965
|
+
# イベントの判定
|
966
|
+
formula = dates.cal4note.l_phases.formula
|
967
|
+
clock = formula.kind_of?(When::Ephemeris::ChineseTrueLunation) &&
|
968
|
+
(5..25).include?(dates.l_date.cal_date[2]) ?
|
969
|
+
When.Clock(-21600) : # 唐代暦法の望弦は午前6時を日の境界とする
|
970
|
+
dates.l_date.frame._time_basis[-1] # その他(進朔も考慮した時刻)
|
971
|
+
odate = When.when?(dates.o_date.to_cal_date.to_s, {:frame=>dates.o_date.frame, :clock=>clock})
|
972
|
+
phases = formula.phase_range(odate)
|
973
|
+
thitis = phases.map {|phase| (phase % 1) * 30.0}
|
974
|
+
note = if thitis[0] >= thitis[1]
|
975
|
+
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian) || conditions[:shoyo] ? '朔' : nil
|
976
|
+
else
|
977
|
+
range = thitis[0]...thitis[1]
|
978
|
+
range.include?( 7.5) ? '上弦' :
|
979
|
+
range.include?(15.0) ? '望' :
|
980
|
+
range.include?(22.5) ? '下弦' : nil
|
981
|
+
end
|
982
|
+
|
983
|
+
# 結果の反映
|
984
|
+
if conditions[:shoyo]
|
985
|
+
# :shoyo が true ならイベント時刻も返す
|
986
|
+
notes['月相'] = if note
|
987
|
+
etime = formula._to_seed_type(formula.cn_to_time((phases[1] * 4).floor / 4.0), odate)
|
988
|
+
if formula.respond_to?(:lunation_length) && formula.lunation_length.kind_of?(Rational)
|
989
|
+
shoyo = etime.clk_time.universal_time
|
990
|
+
shoyo += When::TM::Duration::DAY if (0...clock.universal_time).include?(shoyo)
|
991
|
+
shoyo = (shoyo / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
|
992
|
+
shoyo = shoyo.to_i if shoyo == shoyo.to_i
|
993
|
+
"#{note}(#{shoyo}/#{formula.denominator})"
|
994
|
+
else
|
995
|
+
etime.events = [note]
|
996
|
+
etime
|
997
|
+
end
|
998
|
+
else
|
999
|
+
nil
|
1000
|
+
end
|
1001
|
+
else
|
1002
|
+
# :shoyo が false ならイベン名のみ返す
|
1003
|
+
notes['月相'] = note
|
1004
|
+
end
|
1005
|
+
end
|
1006
|
+
|
1007
|
+
# 月食
|
1008
|
+
unless notes['月食'] && notes['神吉'] && notes['三寶吉'] && notes['小字注']
|
1009
|
+
level = (conditions[:lunar_eclipse]||0).to_i
|
1010
|
+
if level == -1
|
1011
|
+
note = nil
|
1012
|
+
else
|
1013
|
+
key = dates.m_date.to_s[/\(.+\z/]
|
1014
|
+
if key
|
1015
|
+
note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
|
1016
|
+
elsif dates.o_date.location &&
|
1017
|
+
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
1018
|
+
info = dates.o_date.location.lunar_eclipse(date..date)
|
1019
|
+
note = '月' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
|
1020
|
+
end
|
1021
|
+
if note
|
1022
|
+
note.sub!(/\*.*\z/, '')
|
1023
|
+
note = nil unless /月/ =~ note
|
1024
|
+
note = nil if level[0] == 1 && /昼/ =~ note
|
1025
|
+
note = nil if level[1] == 1 && /^\(/ =~ note
|
1026
|
+
end
|
1027
|
+
end
|
1028
|
+
notes['月食'] = note
|
1029
|
+
end
|
1030
|
+
|
1031
|
+
notes
|
1032
|
+
end
|
1033
|
+
end
|
1034
|
+
|
1035
|
+
#
|
1036
|
+
# 太陽黄経による暦注
|
1037
|
+
#
|
1038
|
+
class Japanese::SolarTerms < SolarTerms
|
1039
|
+
|
1040
|
+
Notes12 = %w(正月 二月 三月 四月 五月 六月 七月 八月 九月 十月 十一月 十二月)
|
1041
|
+
|
1042
|
+
Notes10 = [
|
1043
|
+
%w(初伏 初伏),
|
1044
|
+
%w(仲伏 中伏),
|
1045
|
+
%w(後伏 末伏)]
|
1046
|
+
|
1047
|
+
Notes60_A = [
|
1048
|
+
# +0
|
1049
|
+
'侯小過外', # 315 : 正月
|
1050
|
+
'侯需外', # 345 : 二月
|
1051
|
+
'侯豫外', # 15 : 三月
|
1052
|
+
'侯旅外', # 45 : 四月
|
1053
|
+
'侯大有外', # 75 : 五月
|
1054
|
+
'侯鼎外', # 105 : 六月
|
1055
|
+
'侯恆外', # 135 : 七月
|
1056
|
+
'侯巽外', # 165 : 八月
|
1057
|
+
'侯歸妹外', # 195 : 九月
|
1058
|
+
'侯艮外', # 225 : 十月
|
1059
|
+
'侯未濟外', # 255 : 十一月
|
1060
|
+
'侯屯外' # 285 : 十二月
|
1061
|
+
]
|
1062
|
+
|
1063
|
+
Notes60_B = [
|
1064
|
+
# +3 +9 +15 +21 +27
|
1065
|
+
'大夫蒙', '卿益', '公漸', '辟泰', '侯需内', # 315 : 正月
|
1066
|
+
'大夫随', '卿晋', '公解', '辟大壯', '侯豫内', # 345 : 二月
|
1067
|
+
'大夫訟', '卿蠱', '公革', '辟夬', '侯旅内', # 15 : 三月
|
1068
|
+
'大夫師', '卿比', '公小畜', '辟乾', '侯大有内', # 45 : 四月
|
1069
|
+
'大夫家人', '卿井', '公咸', '辟姤', '侯鼎内', # 75 : 五月
|
1070
|
+
'大夫豊', '卿渙', '公履', '辟遯', '侯恆内', # 105 : 六月
|
1071
|
+
'大夫節', '卿同人', '公損', '辟否', '侯巽内', # 135 : 七月
|
1072
|
+
'大夫萃', '卿大畜', '公賁', '辟観', '侯歸妹内', # 165 : 八月
|
1073
|
+
'大夫無妄', '卿明夷', '公困', '辟剥', '侯艮内', # 195 : 九月
|
1074
|
+
'大夫既濟', '卿噬嗑', '公大過', '辟坤', '侯未濟内', # 225 : 十月
|
1075
|
+
'大不蹇', '卿頤', '公中孚', '辟復', '侯屯内', # 255 : 十一月
|
1076
|
+
'大夫謙', '卿睽', '公升', '辟臨', '侯小過内' # 285 : 十二月
|
1077
|
+
]
|
1078
|
+
|
1079
|
+
Notes72 = [
|
1080
|
+
# 儀鳳暦 宣明暦(中国) 宣明暦 貞享暦 宝暦暦・寛政暦 略本暦
|
1081
|
+
# 315 : 正月
|
1082
|
+
%w(雞始乳 東風解凍 東風解凍 東風解凍 東風解凍 東風解凍),
|
1083
|
+
%w(東風解凍 蟄始振 蟄虫始振 梅花乃芳 黄鶯睍睆 黄鶯睍睆),
|
1084
|
+
%w(蟄蟲始振 魚上氷 魚上氷 魚上氷 魚上氷 魚上氷),
|
1085
|
+
%w(魚上冰 獺祭魚 獺祭魚 土脈潤起 土脈潤起 土脉潤起),
|
1086
|
+
%w(獺祭魚 鴻雁来 鴻雁来 霞彩碧空 霞始靆 霞始靆),
|
1087
|
+
%w(鴻雁來 草木萌動 草木萌動 草木萌動 草木萌動 草木萌動),
|
1088
|
+
|
1089
|
+
# 345 : 二月
|
1090
|
+
%w(始雨水 桃始華 桃始華 蟄虫啓戸 蟄虫啓戸 蟄虫啓戸),
|
1091
|
+
%w(桃始花 倉庚鳴 倉庚鳴 寒雨間熟 桃始笑 桃始笑),
|
1092
|
+
%w(倉庚鳴 鷹化爲鳩 鷹化爲鳩 菜虫化蝶 菜虫化蝶 菜虫化蝶),
|
1093
|
+
%w(鷹化爲鳩 玄鳥至 玄鳥至 雀始巣 雀始巣 雀始巣),
|
1094
|
+
%w(玄鳥至 雷乃發聲 雷乃發聲 雷乃発声 桜始開 桜始開),
|
1095
|
+
%w(雷始發聲 始電 始電 桜始開桃始笑 雷乃発声 雷乃発声),
|
1096
|
+
|
1097
|
+
# 15 : 三月
|
1098
|
+
%w(始雷 桐始華 桐始華 玄鳥至 玄鳥至 玄鳥至),
|
1099
|
+
%w(蟄蟲咸動 田鼠化爲鴑 田鼠化爲鴑 鴻雁北 鴻雁北 鴻雁北),
|
1100
|
+
%w(蟄蟲啓戸 虹始見 虹始見 虹始見 虹始見 虹始見),
|
1101
|
+
%w(桐始華 萍始生 萍始生 葭始生 葭始生 葭始生),
|
1102
|
+
%w(田鼠化爲鴑 鳴鳩拂其羽 鳴鳩拂其羽 牡丹華 霜止出苗 霜止出苗),
|
1103
|
+
%w(虹始見 戴勝降于桑 戴勝降于桑 霜止出苗 牡丹華 牡丹華),
|
1104
|
+
|
1105
|
+
# 45 : 四月
|
1106
|
+
%w(萍始生 螻蟈鳴 螻蟈鳴 鵑始鳴 鼃始鳴 鼃始鳴),
|
1107
|
+
%w(戴勝降于桑 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出 蚯蚓出),
|
1108
|
+
%w(螻蟈鳴 王瓜生 王瓜生 竹笋生 竹笋生 竹笋生),
|
1109
|
+
%w(蚯蚓出 苦菜秀 苦菜秀 蚕起食桑 蚕起食桑 蚕起食桑),
|
1110
|
+
%w(王瓜生 靡草死 靡草死 紅花栄 紅花栄 紅花栄),
|
1111
|
+
%w(苦菜秀 小暑至 小暑至 麦秋至 麦秋至 麦秋至),
|
1112
|
+
|
1113
|
+
# 75 : 五月
|
1114
|
+
%w(靡草死 螳蜋生 螳蜋生 螳螂生 螳螂生 螳螂生),
|
1115
|
+
%w(小暑至 鵙始鳴 鵙始鳴 腐草為螢 腐草為螢 腐草為螢),
|
1116
|
+
%w(螳螂生 反舌無聲 反舌無聲 梅始黄 梅子黄 梅子黄),
|
1117
|
+
%w(鵙始鳴 鹿角解 鹿角解 乃東枯 乃東枯 乃東枯),
|
1118
|
+
%w(反舌無聲 蜩始鳴 蜩始鳴 分龍雨 菖蒲華 菖蒲華),
|
1119
|
+
%w(鹿角解 半夏生 半夏生 半夏生 半夏生 半夏生),
|
1120
|
+
|
1121
|
+
# 105 : 六月
|
1122
|
+
%w(蟬始鳴 温風至 温風至 温風至 温風至 温風至),
|
1123
|
+
%w(半夏生 蟋蟀居壁 蟋蟀居壁 蓮始華 蓮始華 蓮始開),
|
1124
|
+
%w(木槿榮 鷹乃學習 鷹乃學習 鷹乃学習 鷹乃学習 鷹乃学習),
|
1125
|
+
%w(温風至 腐草爲螢 腐草爲螢 桐始結花 桐始結花 桐始結花),
|
1126
|
+
%w(蟋蟀居壁 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑 土潤溽暑),
|
1127
|
+
%w(鷹乃學習 大雨時行 大雨時行 大雨時行 大雨時行 大雨時行),
|
1128
|
+
|
1129
|
+
# 135 : 七月
|
1130
|
+
%w(腐草爲螢 涼風至 涼風至 涼風至 涼風至 涼風至),
|
1131
|
+
%w(土潤溽暑 白露降 白露降 山沢浮雲 寒蝉鳴 寒蝉鳴),
|
1132
|
+
%w(涼風至 寒蟬鳴 寒蟬鳴 霧色已成 蒙霧升降 蒙霧升降),
|
1133
|
+
%w(白露降 鷹乃祭鳥 鷹乃祭鳥 寒蝉鳴 綿柎開 綿柎開),
|
1134
|
+
%w(寒蟬鳴 天地始肅 天地始肅 天地始粛 天地始粛 天地始粛),
|
1135
|
+
%w(鷹祭鳥 禾乃登 禾乃登 禾乃登 禾乃登 禾乃登),
|
1136
|
+
|
1137
|
+
# 165 : 八月
|
1138
|
+
%w(天地始肅 鴻雁来 鴻雁来 草露白 草露白 草露白),
|
1139
|
+
%w(暴風至 玄鳥歸 玄鳥歸 鶺鴒鳴 鶺鴒鳴 鶺鴒鳴),
|
1140
|
+
%w(鴻雁來 群鳥養羞 群鳥養羞 玄鳥去 玄鳥去 玄鳥去),
|
1141
|
+
%w(玄鳥歸 雷乃收聲 雷乃收聲 鴻雁来 雷乃収声 雷乃収声),
|
1142
|
+
%w(羣鳥養羞 蟄蟲坏戸 蟄蟲坏戸 蟄虫坏戸 蟄虫坏戸 蟄虫坏戸),
|
1143
|
+
%w(雷始收聲 水始涸 水始涸 水始涸 水始涸 水始涸),
|
1144
|
+
|
1145
|
+
# 195 : 九月
|
1146
|
+
%w(蟄蟲坏戸 鴻雁來賓 鴻雁來賓 棗栗零 鴻雁来 鴻雁来),
|
1147
|
+
%w(陰氣方盛 雀入大水爲蛤 雀入大水爲蛤 蟋蟀在戸 菊花開 菊花開),
|
1148
|
+
%w(陽氣始衰 菊有黄花 菊有黄花 菊花開 蟋蟀在戸 蟋蟀在戸),
|
1149
|
+
%w(水始涸 豺乃祭獸 豺乃祭獸 霜始降 霜始降 霜始降),
|
1150
|
+
%w(鴻雁來賓 草木黄落 草木黄落 蔦楓紅葉 霎時施 霎時施),
|
1151
|
+
%w(雀入水爲蛤 蟄蟲咸俯 蟄蟲咸俯 鶯雛鳴 楓蔦黄 楓蔦黄),
|
1152
|
+
|
1153
|
+
# 225 : 十月
|
1154
|
+
%w(菊有黄花 水始冰 水始冰 山茶始開 山茶始開 山茶始開),
|
1155
|
+
%w(豺祭獣 地始凍 地始凍 地始凍 地始凍 地始凍),
|
1156
|
+
%w(水始冰 野雞入大水爲蜃 野雞入大水爲蜃 霎乃降 金盞香 金盞香),
|
1157
|
+
%w(地始凍 虹藏不見 虹藏不見 虹蔵不見 虹蔵不見 虹蔵不見),
|
1158
|
+
%w(野雞入水爲蜃 天氣上騰地氣下降 天氣上騰地氣下降 樹葉咸落 朔風払葉 朔風払葉),
|
1159
|
+
%w(虹藏不見 閉塞而成冬 閉塞而成冬 橘始黄 橘始黄 橘始黄),
|
1160
|
+
|
1161
|
+
# 255 : 十一月
|
1162
|
+
%w(冰益壯 鶡鳥不鳴 鶡鳥不鳴 閉塞成冬 閉塞成冬 閉塞成冬),
|
1163
|
+
%w(地始坼 虎始交 虎始交 熊蟄穴 熊蟄穴 熊蟄穴),
|
1164
|
+
%w(鶡鳥不鳴 茘挺生 茘挺生 水仙開 鱖魚群 鱖魚群),
|
1165
|
+
%w(虎始交 蚯蚓結 蚯蚓結 乃東生 乃東生 乃東生),
|
1166
|
+
%w(芒始生 麋角解 麋角解 麋角解 麋角解 麋角解),
|
1167
|
+
%w(茘挺生 水泉動 水泉動 雪下出麦 雪下出麦 雪下出麦),
|
1168
|
+
|
1169
|
+
# 285 : 十二月
|
1170
|
+
%w(蚯蚓結 雁北郷 雁北郷 芹乃栄 芹乃栄 芹乃栄),
|
1171
|
+
%w(麋角解 鵲始巣 鵲始巣 風気乃行 水泉動 水泉動),
|
1172
|
+
%w(水泉動 野雞始鴝 野雞始鴝 雉始雊 雉始雊 雉始雊),
|
1173
|
+
%w(雁北郷 雞始乳 雞始乳 款冬華 款冬華 款冬華),
|
1174
|
+
%w(鵲始巣 鷙鳥厲疾 鷙鳥厲疾 水沢腹堅 水沢腹堅 水沢腹堅),
|
1175
|
+
%w(雉始雊 水澤腹堅 水澤腹堅 鶏始乳 鶏始乳 鶏始乳)
|
1176
|
+
]
|
1177
|
+
|
1178
|
+
# 計算結果の修正
|
1179
|
+
# @private
|
1180
|
+
Patch = {
|
1181
|
+
2039054 => [149.0, 1], # 貞観12(0870).07.17 [149.0, 0] 没
|
1182
|
+
2039055 => [150.0, 0], # 貞観12(0870).07.18 [150.0, 1] 処暑
|
1183
|
+
|
1184
|
+
2107233 => [ 29.0, 1], # 天喜05(1057).03.10 [ 29.0, 0] 没
|
1185
|
+
2107234 => [ 30.0, 0], # 天喜05(1057).03.11 [ 30.0, 1] 穀雨
|
1186
|
+
|
1187
|
+
2160437 => [269.0, 0], # 建仁02(1202).10=29 [270.0, 1] 冬至
|
1188
|
+
2160438 => [270.0, 1], # 建仁02(1202).11.01 [271.0, 1]
|
1189
|
+
2160439 => [271.0, 1], # 建仁02(1202).11.02 [272.0, 1]
|
1190
|
+
2160440 => [272.0, 1], # 建仁02(1202).11.03 [272.0, 0] 没
|
1191
|
+
|
1192
|
+
2175412 => [269.0, 1], # 寛元01(1243).11.03 [269.0, 0] 没
|
1193
|
+
2175413 => [270.0, 0], # 寛元01(1243).11.04 [270.0, 1] 冬至
|
1194
|
+
|
1195
|
+
2189200 => [179.0, 0], # 弘安04(1281).07=30 [180.0, 1] 秋分
|
1196
|
+
2189201 => [180.0, 1], # 弘安04(1281).08.01 [181.0, 1]
|
1197
|
+
2189202 => [181.0, 1], # 弘安04(1281).08.02 [181.0, 0] 没
|
1198
|
+
|
1199
|
+
2243577 => [136.0, 0], # 永享02(1430).07.11 [136.0, 1] (立秋の翌日)
|
1200
|
+
2243578 => [136.0, 1], # 永享02(1430).07.12 [137.0, 1]
|
1201
|
+
2243579 => [137.0, 1], # 永享02(1430).07.13 [138.0, 1]
|
1202
|
+
2243580 => [138.0, 1], # 永享02(1430).07.14 [139.0, 1]
|
1203
|
+
2243581 => [139.0, 1], # 永享02(1430).07.15 [140.0, 1]
|
1204
|
+
2243582 => [140.0, 1], # 永享02(1430).07.16 [141.0, 1]
|
1205
|
+
2243583 => [141.0, 1], # 永享02(1430).07.17 [142.0, 1]
|
1206
|
+
2243584 => [142.0, 1], # 永享02(1430).07.18 [143.0, 1]
|
1207
|
+
2243585 => [143.0, 1], # 永享02(1430).07.19 [144.0, 1]
|
1208
|
+
2243586 => [144.0, 1], # 永享02(1430).07.20 [145.0, 1]
|
1209
|
+
2243587 => [145.0, 1], # 永享02(1430).07.21 [146.0, 1]
|
1210
|
+
2243588 => [146.0, 1], # 永享02(1430).07.22 [147.0, 1]
|
1211
|
+
2243589 => [147.0, 1], # 永享02(1430).07.23 [148.0, 1]
|
1212
|
+
2243590 => [148.0, 1], # 永享02(1430).07.24 [149.0, 1]
|
1213
|
+
2243591 => [149.0, 1], # 永享02(1430).07.25 [149.0, 0] 没 (処暑の前日)
|
1214
|
+
|
1215
|
+
2311770 => [ 29.0, 1], # 元和03(1617).03.18 [ 29.0, 0] 没
|
1216
|
+
2311771 => [ 30.0, 0], # 元和03(1617).03.19 [ 30.0, 1] 穀雨
|
1217
|
+
|
1218
|
+
2396062 => [314.0, 0], # 弘化04(1847).12.30 [315.0, 1] 立春 (計算誤差の補正)
|
1219
|
+
2396063 => [315.0, 1], # 弘化05(1848).01.01 [315.0, 0] 没
|
1220
|
+
|
1221
|
+
2397583 => [ 15.0, 1], # 嘉永05(1852).02=15 [ 14.0, 0] 没
|
1222
|
+
2397584 => [ 16.0, 0] # 嘉永05(1852).02=16 [ 15.0, 1] 清明 (計算誤差の補正)
|
1223
|
+
}
|
1224
|
+
|
1225
|
+
class << self
|
1226
|
+
# テスト用の属性
|
1227
|
+
attr_writer :patch
|
1228
|
+
private :patch=
|
1229
|
+
|
1230
|
+
# 日の暦注
|
1231
|
+
# @private
|
1232
|
+
def _day_notes(notes, dates, conditions={})
|
1233
|
+
date = When.when?(dates.o_date.to_cal_date.to_s,
|
1234
|
+
{:frame=>dates.o_date.frame,
|
1235
|
+
:clock=>dates.s_date.frame._time_basis[0]})
|
1236
|
+
patch = (@patch || Patch)[date.to_i] unless dates.o_date.frame.respond_to?(:twin) &&
|
1237
|
+
dates.o_date.frame.twin
|
1238
|
+
longitude, motsu = patch ? patch : dates.cal4note.s_terms.position(date)
|
1239
|
+
|
1240
|
+
# 三伏 - 庚
|
1241
|
+
#
|
1242
|
+
# 初 : 夏至から 20..29
|
1243
|
+
# 仲 : 夏至から 30..39
|
1244
|
+
# 後 : 立秋から 0..9
|
1245
|
+
if !notes['三伏'] && notes['干'].remainder == 6 # 庚
|
1246
|
+
index = dates.range >= 11 ? 1 : 0
|
1247
|
+
if 109 <= longitude && longitude <= 129 # 夏至から
|
1248
|
+
term = dates.cal4note.s_terms.term(date, [-270,360])
|
1249
|
+
diff = dates.s_date.to_i - term.to_i
|
1250
|
+
notes['三伏'] = Notes10[0][index] if 20 <= diff && diff <= 29
|
1251
|
+
notes['三伏'] = Notes10[1][index] if 30 <= diff && diff <= 39
|
1252
|
+
elsif longitude == 135 # 立秋
|
1253
|
+
notes['三伏'] = Notes10[2][index]
|
1254
|
+
elsif 136 <= longitude && longitude <= 144 # 立秋から
|
1255
|
+
term = dates.cal4note.s_terms.term(date, [-225,360])
|
1256
|
+
diff = dates.s_date.to_i - term.to_i
|
1257
|
+
notes['三伏'] = Notes10[2][index] if 0 < diff && diff <= 9
|
1258
|
+
end
|
1259
|
+
end
|
1260
|
+
|
1261
|
+
# 社 - 戊
|
1262
|
+
#
|
1263
|
+
# 春秋分から -5..4
|
1264
|
+
if !notes['社'] && notes['干'].remainder == 4 # 戊
|
1265
|
+
if (longitude + 5) % 180 < 10 # 春秋分の近傍
|
1266
|
+
term = dates.cal4note.s_terms.term(date - When.Duration('P5D'), [0,180])
|
1267
|
+
diff = dates.s_date.to_i - term.to_i
|
1268
|
+
notes['社'] = '社' if -5 <= diff && diff <= 4
|
1269
|
+
end
|
1270
|
+
end
|
1271
|
+
|
1272
|
+
# 臘 - 辰
|
1273
|
+
#
|
1274
|
+
# 大寒から -6..5
|
1275
|
+
if !notes['臘'] && notes['支'].remainder == 4 # 辰
|
1276
|
+
if (longitude - 339) % 360 < 12 # 大寒の近傍
|
1277
|
+
term = dates.cal4note.s_terms.term(date - When.Duration('P6D'), [345,360])
|
1278
|
+
diff = dates.s_date.to_i - term.to_i
|
1279
|
+
notes['臘'] = '臘' if -6 <= diff && diff <= 5
|
1280
|
+
end
|
1281
|
+
end
|
1282
|
+
|
1283
|
+
# 土用事
|
1284
|
+
unless notes['土用事']
|
1285
|
+
_longitude, _motsu = dates.cal4note.s_terms2.instance_of?(self) && dates.cal4note.doyo == 0 ? [longitude, motsu] :
|
1286
|
+
dates.cal4note.s_terms2.position(date, -dates.cal4note.doyo)
|
1287
|
+
if _motsu != 0 && _longitude % 90 == 27
|
1288
|
+
notes['土用事'] =
|
1289
|
+
begin
|
1290
|
+
event_name =
|
1291
|
+
case dates.range
|
1292
|
+
when 0 ; '土用' # 元嘉暦以前
|
1293
|
+
when 1 ; '土王' # 麟徳暦
|
1294
|
+
when 2..10 ; '土用事' # 大衍暦~宣明暦
|
1295
|
+
else ; '土用入' # 貞享暦以降
|
1296
|
+
end
|
1297
|
+
if conditions[:shoyo]
|
1298
|
+
dates.cal4note.s_terms2.event_time(date, event_name, [27-dates.cal4note.doyo, 90])
|
1299
|
+
else
|
1300
|
+
event_name
|
1301
|
+
end
|
1302
|
+
end
|
1303
|
+
end
|
1304
|
+
end
|
1305
|
+
|
1306
|
+
# 入梅 - 壬
|
1307
|
+
#
|
1308
|
+
# 貞享2(1685)~ 芒種から 1..10 日の壬の日
|
1309
|
+
# 元文5(1740)~ 芒種から 0..9 日の壬の日
|
1310
|
+
# 明治9(1876)~ 太陽黄経80度
|
1311
|
+
unless notes['入梅']
|
1312
|
+
if dates.year >= 1876
|
1313
|
+
notes['入梅'] = '入梅' if longitude == 80 && motsu == 1
|
1314
|
+
elsif notes['干'].remainder == 8 # 壬
|
1315
|
+
if (longitude - 75) % 360 <= 10 # 芒種の近傍
|
1316
|
+
term = dates.cal4note.s_terms.term(date - When.Duration('P11D'), [75,360])
|
1317
|
+
diff = dates.s_date.to_i - term.to_i
|
1318
|
+
diff += 1 if dates.year >= 1740
|
1319
|
+
notes['入梅'] = '入梅' if dates.range >= 11 && 1 <= diff && diff <= 10
|
1320
|
+
end
|
1321
|
+
end
|
1322
|
+
end
|
1323
|
+
|
1324
|
+
# 半夏生
|
1325
|
+
#
|
1326
|
+
# 太陽黄経100度
|
1327
|
+
notes['半夏生'] ||= '半夏生' if longitude == 100 && motsu == 1
|
1328
|
+
|
1329
|
+
# 立春を起算日とする雑節
|
1330
|
+
#
|
1331
|
+
unless notes['節分'] && notes['八十八夜'] && notes['二百十日'] && notes['二百廿日']
|
1332
|
+
term = dates.cal4note.s_terms.term(date + When.Duration('P3D'), [-45,360])
|
1333
|
+
case dates.s_date.to_i - term.to_i
|
1334
|
+
when -1 ; notes['節分'] ||= '節分'
|
1335
|
+
when 87 ; notes['八十八夜'] ||= '八十八夜'
|
1336
|
+
when 209 ; notes['二百十日'] ||= '二百十日'
|
1337
|
+
when 219 ; notes['二百廿日'] ||= '二百廿日'
|
1338
|
+
end
|
1339
|
+
end
|
1340
|
+
|
1341
|
+
# 日食
|
1342
|
+
unless notes['日食'] && notes['小字注']
|
1343
|
+
level = (conditions[:solar_eclipse]||0).to_i
|
1344
|
+
if level == -1
|
1345
|
+
note = nil
|
1346
|
+
else
|
1347
|
+
key = dates.m_date.to_s[/\(.+\z/]
|
1348
|
+
if key
|
1349
|
+
note, = Japanese::Eclipse::Eclipses[key.gsub(/[()]/,'')]
|
1350
|
+
elsif dates.o_date.location &&
|
1351
|
+
dates.o_date.frame.kind_of?(When::CalendarTypes::Christian)
|
1352
|
+
info = dates.o_date.location.solar_eclipse(date..date)
|
1353
|
+
note = '日' + Japanese::Eclipse.eclipse_summary(info[0]) unless info.empty?
|
1354
|
+
end
|
1355
|
+
if note
|
1356
|
+
note.sub!(/\*.*\z/, '')
|
1357
|
+
note = nil unless /日/ =~ note
|
1358
|
+
note = nil if level[0] == 1 && /夜/ =~ note
|
1359
|
+
note = nil if level[1] == 1 && /^\(/ =~ note
|
1360
|
+
end
|
1361
|
+
end
|
1362
|
+
notes['日食'] = note
|
1363
|
+
end
|
1364
|
+
|
1365
|
+
# 没
|
1366
|
+
if motsu == 0
|
1367
|
+
notes['没'] = dates.range < 11 ? '没' : nil
|
1368
|
+
return notes unless patch
|
1369
|
+
else
|
1370
|
+
notes['没'] = nil
|
1371
|
+
end
|
1372
|
+
|
1373
|
+
# 廿四節気
|
1374
|
+
div, mod = longitude.divmod(15)
|
1375
|
+
if mod == 0
|
1376
|
+
note = (div - 21) % 24
|
1377
|
+
div, mod = note.divmod(2)
|
1378
|
+
notes['節中'] ||= Notes12[div] + %w(節 中)[mod]
|
1379
|
+
notes['廿四節気'] ||=
|
1380
|
+
begin
|
1381
|
+
residue = When.Resource(dates.range == 1 ? '_co:Common?V=0618' : '_co:Common')['二十四節気::*'][(note-3) % 24]
|
1382
|
+
if conditions[:shoyo]
|
1383
|
+
dates.cal4note.s_terms.event_time(date, residue.label, [0,15])
|
1384
|
+
else
|
1385
|
+
residue
|
1386
|
+
end
|
1387
|
+
end
|
1388
|
+
end
|
1389
|
+
|
1390
|
+
# 七十二候
|
1391
|
+
div, mod = longitude.divmod(5)
|
1392
|
+
notes['七十二候'] ||= mod == 0 ? Notes72[(div - 63) % 72][dates.index_s] : nil
|
1393
|
+
|
1394
|
+
# 往亡
|
1395
|
+
unless notes['往亡'] && notes['神吉'] && notes['雑事吉']
|
1396
|
+
month = dates.s_date.cal_date[-2] - 1
|
1397
|
+
day = dates.s_date.cal_date[-1] - 1
|
1398
|
+
div, mod = month.divmod(3)
|
1399
|
+
deg = (div+7)*(mod+1) + month * 30 + 314
|
1400
|
+
notes['往亡'] = (dates.range < 11 ? (deg - longitude) % 360 == 0 : # 没を含まない
|
1401
|
+
(deg - 315 ) % 30 == day)? '往亡' : nil # 没を含む
|
1402
|
+
end
|
1403
|
+
|
1404
|
+
# 伏龍
|
1405
|
+
notes['伏龍'] ||= {
|
1406
|
+
315 => '庭内去堂', 15 => '門内百日', 115 => '東垣六十日',
|
1407
|
+
175 => '四隅百日', 275 => '竈内四十日'
|
1408
|
+
}[longitude]
|
1409
|
+
|
1410
|
+
# 六十卦
|
1411
|
+
div, mod = longitude.divmod(30)
|
1412
|
+
notes['六十卦'] ||= mod == 15 ? Notes60_A[(div - 10) % 12] : nil
|
1413
|
+
div, mod = longitude.divmod(6)
|
1414
|
+
notes['六十卦'] ||= mod == 0 ? Notes60_B[(div - 53) % 60] : nil
|
1415
|
+
|
1416
|
+
# 彼岸
|
1417
|
+
unless notes['彼岸']
|
1418
|
+
if dates.range < 11
|
1419
|
+
notes['彼岸'] = '彼岸' if longitude % 180 == 2 # 宣明暦以前(没を除いて3日後)
|
1420
|
+
else
|
1421
|
+
term = dates.cal4note.s_terms.term(date - When.Duration('P7D'), [0,180]) # 近傍の春秋分
|
1422
|
+
case dates.s_date.to_i - term.to_i
|
1423
|
+
when 2 ; notes['彼岸'] = '彼岸' if dates.range == 11 # 貞享暦(没を含めて3日後)
|
1424
|
+
when -5 ; notes['彼岸'] = '彼岸' if longitude > 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(春-6日前))
|
1425
|
+
when -1 ; notes['彼岸'] = '彼岸' if longitude <= 180 && (1755...1844).include?(dates.year) # 宝暦暦・寛政暦(秋-2日前)
|
1426
|
+
when -3 ; notes['彼岸'] = '彼岸' if dates.year >= 1844 # 天保暦以降(秋-4日前)
|
1427
|
+
end
|
1428
|
+
end
|
1429
|
+
notes['彼岸'] = nil unless notes['彼岸'] == '彼岸'
|
1430
|
+
end
|
1431
|
+
|
1432
|
+
notes
|
1433
|
+
end
|
1434
|
+
end
|
1435
|
+
end
|
1436
|
+
|
1437
|
+
#
|
1438
|
+
# 太陽黄経による暦注
|
1439
|
+
#
|
1440
|
+
class Japanese::SolarTermsRevised < Japanese::SolarTerms
|
1441
|
+
|
1442
|
+
# 土用策
|
1443
|
+
DoyoShift = When::TM::PeriodDuration.new([0,0,12.1747411317])
|
1444
|
+
|
1445
|
+
# 日付に対応する座標
|
1446
|
+
#
|
1447
|
+
# @param [When::TM::TemporalPosition] date 日付
|
1448
|
+
# @param [Numeric] delta 周期の補正(土用の時刻の補正に使用,デフォルト 0)
|
1449
|
+
#
|
1450
|
+
# @return [Array<Integer>] Array< Integer, 0 or 1 or 2 >
|
1451
|
+
#
|
1452
|
+
# [Integer] 対応する座標
|
1453
|
+
#
|
1454
|
+
# [0 or 1 or 2] 座標の進み(0 なら 没, 2 なら滅)
|
1455
|
+
#
|
1456
|
+
def position(date, delta=0)
|
1457
|
+
return super if date.most_significant_coordinate >= 1869
|
1458
|
+
date = date.floor
|
1459
|
+
p0, p1 = [date, date.succ].map {|d| (30.0 * @formula.time_to_cn(d-DoyoShift) - @margin + 12).floor}
|
1460
|
+
[p1 % @den, p1 - p0]
|
1461
|
+
end
|
1462
|
+
|
1463
|
+
#
|
1464
|
+
# イベント日付(時刻付)
|
1465
|
+
#
|
1466
|
+
# @private
|
1467
|
+
def event_time(date, event_name, event)
|
1468
|
+
return super if date.most_significant_coordinate >= 1869
|
1469
|
+
etime = term(date + When.Duration('P3D'), [-15,30], When::SYSTEM) + DoyoShift
|
1470
|
+
if formula.respond_to?(:year_length) && formula.denominator && formula.denominator < 100000
|
1471
|
+
fraction = etime.clk_time.local_time
|
1472
|
+
fraction += When::TM::Duration::DAY * (etime.to_i - date.to_i)
|
1473
|
+
fraction = (fraction / When::TM::Duration::DAY * formula.denominator * 1000 + 0.5).floor / 1000.0
|
1474
|
+
fraction = fraction.to_i if fraction == fraction.to_i
|
1475
|
+
event_name + "(#{fraction}/#{formula.denominator})"
|
1476
|
+
else
|
1477
|
+
etime.events = [event_name]
|
1478
|
+
etime
|
1479
|
+
end
|
1480
|
+
end
|
1481
|
+
end
|
1482
|
+
end
|