ruby_lunardate 0.1.0 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e27df958bc842fd3b234da92b3f17650d513bc23
4
- data.tar.gz: aacff5f2856b9b928b1669708bc713394bb02c1c
3
+ metadata.gz: d4d97dd05b1887eb149e7dc3359a6939cec0d952
4
+ data.tar.gz: 14cbe28b5a401694f8c845a75dddef8a8bf4af14
5
5
  SHA512:
6
- metadata.gz: ba4bc961dc82040eba279cd62ee02abfa710c078f130c729cf5f9e9385382ec8eb2138ade7fde0df1f43e94794cc7243318b1f96e427763ec5fe7203fa26d7aa
7
- data.tar.gz: d42a36287e5ca14dab5976c779435d209952140a84bc0fb0a22e4cc11c9a247e05fdc2e118b6faae87be17dad06f5906d33473cb6cf1e8175d3b242e62e5acb1
6
+ metadata.gz: ca0b5c71c8df83bb84cd7077f1d337298f2f2e5e34dcfa0db80ec1f7af536e003bbe454dd4038b0726df52950bb1aa0fa0c4ec363d4d1f8f5b32ca57e0ac61a6
7
+ data.tar.gz: a5f4562ad2a475ea207a992cf72c93875a2c3df1b85207fc9d7318a792e9a6ba8d511b65b014e900191562b4b3b9abbbfcca41c6b82536b8a5531b6191486b3f
@@ -1,289 +1,284 @@
1
1
  require 'date'
2
2
 
3
- KOREAN_LUNAR_YEAR_INFO = [
4
- [384, 1, 2, 1, 1, 2, 1, 2, 4, 2, 2, 1, 2],
5
- [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1],
6
- [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2],
7
- [383, 1, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2],
8
- [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1],
9
- [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2],
10
- [384, 1, 2, 2, 5, 1, 2, 1, 2, 1, 2, 1, 2],
11
- [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1],
12
- [355, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2],
13
- [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2],
14
- [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1],
15
- [384, 2, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2, 2],
16
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2],
17
- [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2],
18
- [384, 2, 2, 1, 2, 4, 1, 2, 1, 2, 1, 1, 2],
19
- [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2],
20
- [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1],
21
- [384, 2, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1],
22
- [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2],
23
- [384, 1, 2, 1, 1, 2, 1, 4, 2, 2, 1, 2, 2],
24
- [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2],
25
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2],
26
- [384, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 2],
27
- [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2],
28
- [354, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1],
29
- [385, 2, 1, 2, 4, 2, 1, 2, 2, 1, 2, 1, 2],
30
- [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1],
31
- [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2],
32
- [384, 1, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2],
33
- [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2],
34
- [383, 1, 2, 2, 1, 1, 4, 1, 2, 1, 2, 2, 1],
35
- [354, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1],
36
- [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2],
37
- [384, 1, 2, 2, 1, 6, 1, 2, 1, 2, 1, 1, 2],
38
- [355, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2],
39
- [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1],
40
- [384, 2, 1, 5, 1, 2, 1, 2, 1, 2, 2, 2, 1],
41
- [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1],
42
- [384, 2, 2, 1, 1, 2, 1, 5, 1, 2, 2, 1, 2],
43
- [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2],
44
- [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1],
45
- [384, 2, 2, 1, 2, 2, 5, 1, 1, 2, 1, 2, 1],
46
- [355, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2],
47
- [355, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2],
48
- [384, 1, 1, 2, 5, 1, 2, 1, 2, 2, 1, 2, 2],
49
- [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2],
50
- [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2],
51
- [384, 2, 4, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2],
52
- [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2],
53
- [384, 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2],
54
- [354, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1],
55
- [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2],
56
- [384, 1, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1, 2],
57
- [355, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2],
58
- [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2],
59
- [384, 2, 1, 5, 1, 1, 2, 1, 2, 1, 2, 2, 2],
60
- [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2],
61
- [384, 2, 1, 2, 1, 2, 1, 1, 4, 2, 1, 2, 2],
62
- [354, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2],
63
- [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1],
64
- [384, 2, 1, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1],
65
- [355, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2],
66
- [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1],
67
- [384, 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 1],
68
- [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2],
69
- [354, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2],
70
- [383, 1, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 1],
71
- [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2],
72
- [384, 1, 2, 2, 1, 2, 1, 4, 2, 1, 2, 1, 2],
73
- [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1],
74
- [355, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2],
75
- [384, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1, 2],
76
- [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1],
77
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1],
78
- [384, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1, 2],
79
- [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2],
80
- [384, 2, 2, 1, 2, 1, 2, 1, 4, 2, 1, 1, 2],
81
- [354, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1],
82
- [355, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1],
83
- [384, 2, 1, 1, 2, 1, 6, 1, 2, 2, 1, 2, 1],
84
- [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2],
85
- [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2],
86
- [384, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2, 2],
87
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2],
88
- [384, 2, 1, 2, 2, 1, 1, 2, 1, 1, 4, 2, 2],
89
- [354, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2],
90
- [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1],
91
- [385, 2, 1, 2, 2, 1, 4, 2, 2, 1, 2, 1, 2],
92
- [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1],
93
- [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2],
94
- [384, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2, 2, 2],
95
- [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2],
96
- [354, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2],
97
- [383, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1],
98
- [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2],
99
- [384, 1, 2, 2, 1, 2, 2, 1, 4, 2, 1, 1, 2],
100
- [355, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2],
101
- [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1],
102
- [384, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2, 1],
103
- [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1],
104
- [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1],
105
- [384, 2, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2],
106
- [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1],
107
- [355, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2],
108
- [384, 1, 4, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2],
109
- [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1],
110
- [385, 2, 1, 2, 1, 2, 1, 4, 2, 2, 1, 2, 2],
111
- [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2],
112
- [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2],
113
- [384, 2, 2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2],
114
- [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2],
115
- [354, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1],
116
- [384, 2, 1, 6, 2, 1, 2, 1, 1, 2, 1, 2, 1],
117
- [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2],
118
- [384, 1, 2, 1, 2, 1, 2, 1, 2, 4, 2, 1, 2],
119
- [354, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1],
120
- [355, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2],
121
- [384, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2],
122
- [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2],
123
- [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2],
124
- [384, 2, 1, 2, 4, 2, 1, 1, 2, 1, 2, 1, 2],
125
- [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1],
126
- [355, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2],
127
- [384, 1, 4, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2],
128
- [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1],
129
- [384, 2, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1],
130
- [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2],
131
- [354, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2],
132
- [383, 1, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1],
133
- [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2],
134
- [354, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1],
135
- [384, 2, 1, 4, 2, 1, 2, 2, 1, 2, 1, 2, 1],
136
- [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2],
137
- [384, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 4, 2],
138
- [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1],
139
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2],
140
- [384, 2, 2, 1, 2, 1, 5, 1, 1, 2, 2, 1, 2],
141
- [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2],
142
- [354, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1],
143
- [384, 2, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 1],
144
- [355, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1],
145
- [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2],
146
- [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2],
147
- [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2],
148
- [384, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2],
149
- [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2],
150
- [354, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2],
151
- [384, 2, 1, 2, 2, 5, 1, 2, 1, 1, 2, 1, 2],
152
- [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1],
153
- [355, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1]
154
- ]
155
-
156
- MAX_YEAR_NUMBER = 150
157
- CALENDAR_YEAR_INFO_MAP = {
158
- ko: KOREAN_LUNAR_YEAR_INFO
159
- }
160
-
161
- LUNARDAYS_FOR_MONTHTYPE = {
162
- 1 => [29, 29, 0],
163
- 2 => [30, 30, 0],
164
- 3 => [58, 29, 29],
165
- 4 => [59, 30, 29],
166
- 5 => [59, 29, 30],
167
- 6 => [60, 30, 30]
168
- }
169
-
170
3
  class Date
171
4
  def from_solar
172
- return LunarDate.from_solar(self.year, self.month, self.day)
5
+ LunarDate.from_solar(year, month, day)
173
6
  end
174
7
 
175
- def to_solar(is_leap_month = false)
176
- return LunarDate.to_solar(self.year, self.month, self.day, is_leap_month)
8
+ def to_solar(is_leap_month = false, calendar_symbol = :ko)
9
+ LunarDate.to_solar(year, month, day, is_leap_month)
177
10
  end
178
11
  end
179
12
 
180
13
  class LunarDate
181
14
  attr_accessor :year, :month, :day, :is_leap_month
182
15
 
183
- @start_date = Date.new(1900,1,31)
184
- @calendar_symbol = :ko
185
-
186
- def initialize(year, month, day, is_leap_month = false)
187
- self.year = year
188
- self.month = month
189
- self.day = day
190
- self.is_leap_month = is_leap_month
16
+ def self.from_solar(year, month, day, calendar_symbol = :ko)
17
+ solar_date = Date.new(year, month, day)
18
+ days = get_days(solar_date)
19
+ lunar_from_days(days, calendar_symbol)
191
20
  end
192
21
 
193
- def to_s
194
- return "%4d%02d%02d" % [self.year,self.month,self.day]
195
- end
22
+ def self.to_solar(year, month, day, is_leap_month = false, calendar_symbol = :ko)
23
+ days = 0
24
+ year_diff = year - 1900
25
+ year_info = CALENDAR_YEAR_INFO_MAP[calendar_symbol]
196
26
 
197
- def inspect
198
- return to_s
199
- end
27
+ year_diff.times do |year_idx|
28
+ days += year_info[year_idx][0]
29
+ end
200
30
 
201
- def self.lunardays_for_type(month_type)
202
- return LUNARDAYS_FOR_MONTHTYPE[month_type]
203
- end
31
+ (month - 1).times do |month_idx|
32
+ total, _normal, _leap = lunardays_for_type(year_info[year_diff][month_idx + 1])
33
+ days += total
34
+ end
204
35
 
205
- def self.year_info_map
206
- return CALENDAR_YEAR_INFO_MAP[@calendar_symbol]
207
- end
36
+ days += (day - 1)
208
37
 
209
- def self.get_days(solar_date)
210
- return (solar_date - @start_date).to_i
211
- end
38
+ if is_leap_month && year_info[year_diff][month] > 2
39
+ days += lunardays_for_type(year_info[year_diff][month])[1]
40
+ end
212
41
 
213
- def self.from_solar(year, month, day)
214
- solar_date = Date.new(year, month, day)
215
- days = self.get_days(solar_date)
216
- return self.lunar_from_days(days)
42
+ solar_date = SOLAR_START_DATE + days
217
43
  end
218
44
 
219
- def self.is_in_this_days(days, left_days)
220
- return (days - left_days) < 0
45
+ def to_s
46
+ format('%4d%02d%02d', year, month, day)
221
47
  end
222
48
 
223
- def self.is_not_in_this_days(days, left_days)
224
- return self.is_in_this_days(days, left_days) == false
49
+ def inspect
50
+ to_s
225
51
  end
226
52
 
227
- def self.lunar_from_days(days)
228
- start_year = 1900
229
- target_month = 0
230
- is_leap_month = false
231
- matched = false
232
- year_info = self.year_info_map
53
+ private
233
54
 
234
- MAX_YEAR_NUMBER.times do |year_idx|
235
- year_days = year_info[year_idx][0]
236
- if self.is_in_this_days(days, year_days)
237
- 12.times do |month_idx|
238
- total, normal, leap = self.lunardays_for_type(year_info[year_idx][month_idx+1])
239
- if self.is_in_this_days(days, total)
240
- if self.is_not_in_this_days(days, normal)
241
- days -= normal
242
- is_leap_month = true
243
- end
55
+ KOREAN_LUNAR_YEAR_INFO = [
56
+ [384, 1, 2, 1, 1, 2, 1, 2, 4, 2, 2, 1, 2].freeze,
57
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
58
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
59
+ [383, 1, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2].freeze,
60
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
61
+ [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
62
+ [384, 1, 2, 2, 5, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
63
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
64
+ [355, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
65
+ [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
66
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
67
+ [384, 2, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2, 2].freeze,
68
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
69
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
70
+ [384, 2, 2, 1, 2, 4, 1, 2, 1, 2, 1, 1, 2].freeze,
71
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
72
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
73
+ [384, 2, 3, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze,
74
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
75
+ [384, 1, 2, 1, 1, 2, 1, 4, 2, 2, 1, 2, 2].freeze,
76
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
77
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
78
+ [384, 2, 1, 2, 2, 3, 2, 1, 1, 2, 1, 2, 2].freeze,
79
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2].freeze,
80
+ [354, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1].freeze,
81
+ [385, 2, 1, 2, 4, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
82
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
83
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
84
+ [384, 1, 4, 1, 2, 1, 1, 2, 2, 1, 2, 2, 2].freeze,
85
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
86
+ [383, 1, 2, 2, 1, 1, 4, 1, 2, 1, 2, 2, 1].freeze,
87
+ [354, 2, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
88
+ [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
89
+ [384, 1, 2, 2, 1, 6, 1, 2, 1, 2, 1, 1, 2].freeze,
90
+ [355, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
91
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
92
+ [384, 2, 1, 5, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
93
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1].freeze,
94
+ [384, 2, 2, 1, 1, 2, 1, 5, 1, 2, 2, 1, 2].freeze,
95
+ [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
96
+ [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
97
+ [384, 2, 2, 1, 2, 2, 5, 1, 1, 2, 1, 2, 1].freeze,
98
+ [355, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2].freeze,
99
+ [355, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
100
+ [384, 1, 1, 2, 5, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
101
+ [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
102
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2].freeze,
103
+ [384, 2, 4, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
104
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
105
+ [384, 2, 2, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2].freeze,
106
+ [354, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
107
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
108
+ [384, 1, 2, 1, 2, 5, 2, 1, 2, 1, 2, 1, 2].freeze,
109
+ [355, 1, 2, 1, 1, 2, 2, 1, 2, 2, 1, 2, 2].freeze,
110
+ [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
111
+ [384, 2, 1, 5, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
112
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
113
+ [384, 2, 1, 2, 1, 2, 1, 1, 4, 2, 1, 2, 2].freeze,
114
+ [354, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
115
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
116
+ [384, 2, 1, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1].freeze,
117
+ [355, 2, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
118
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
119
+ [384, 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
120
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
121
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2].freeze,
122
+ [383, 1, 2, 4, 2, 1, 1, 2, 1, 1, 2, 2, 1].freeze,
123
+ [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
124
+ [384, 1, 2, 2, 1, 2, 1, 4, 2, 1, 2, 1, 2].freeze,
125
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
126
+ [355, 2, 1, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
127
+ [384, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1, 2].freeze,
128
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
129
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2, 1].freeze,
130
+ [384, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
131
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
132
+ [384, 2, 2, 1, 2, 1, 2, 1, 4, 2, 1, 1, 2].freeze,
133
+ [354, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1].freeze,
134
+ [355, 2, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
135
+ [384, 2, 1, 1, 2, 1, 6, 1, 2, 2, 1, 2, 1].freeze,
136
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
137
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
138
+ [384, 2, 1, 2, 3, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
139
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
140
+ [384, 2, 1, 2, 2, 1, 1, 2, 1, 1, 4, 2, 2].freeze,
141
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
142
+ [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1].freeze,
143
+ [385, 2, 1, 2, 2, 1, 4, 2, 2, 1, 2, 1, 2].freeze,
144
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
145
+ [355, 2, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
146
+ [384, 1, 2, 1, 1, 4, 1, 2, 2, 1, 2, 2, 2].freeze,
147
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2].freeze,
148
+ [354, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
149
+ [383, 1, 2, 4, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
150
+ [355, 2, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
151
+ [384, 1, 2, 2, 1, 2, 2, 1, 4, 2, 1, 1, 2].freeze,
152
+ [355, 1, 2, 1, 2, 2, 1, 2, 1, 2, 2, 1, 2].freeze,
153
+ [354, 1, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
154
+ [384, 2, 1, 1, 2, 3, 2, 2, 1, 2, 2, 2, 1].freeze,
155
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1].freeze,
156
+ [354, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1].freeze,
157
+ [384, 2, 2, 2, 3, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
158
+ [354, 2, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
159
+ [355, 2, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2].freeze,
160
+ [384, 1, 4, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
161
+ [354, 1, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 1].freeze,
162
+ [385, 2, 1, 2, 1, 2, 1, 4, 2, 2, 1, 2, 2].freeze,
163
+ [354, 1, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
164
+ [354, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2].freeze,
165
+ [384, 2, 2, 1, 1, 4, 1, 2, 1, 2, 1, 2, 2].freeze,
166
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
167
+ [354, 2, 1, 2, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
168
+ [384, 2, 1, 6, 2, 1, 2, 1, 1, 2, 1, 2, 1].freeze,
169
+ [355, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2].freeze,
170
+ [384, 1, 2, 1, 2, 1, 2, 1, 2, 4, 2, 1, 2].freeze,
171
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 2, 1, 2, 1].freeze,
172
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2].freeze,
173
+ [384, 1, 2, 1, 2, 3, 2, 1, 2, 1, 2, 2, 2].freeze,
174
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2].freeze,
175
+ [354, 2, 1, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
176
+ [384, 2, 1, 2, 4, 2, 1, 1, 2, 1, 2, 1, 2].freeze,
177
+ [354, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
178
+ [355, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2].freeze,
179
+ [384, 1, 4, 2, 1, 2, 1, 2, 2, 1, 2, 1, 2].freeze,
180
+ [354, 1, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1].freeze,
181
+ [384, 2, 1, 2, 1, 1, 4, 2, 1, 2, 2, 2, 1].freeze,
182
+ [355, 2, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2].freeze,
183
+ [354, 1, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 2].freeze,
184
+ [383, 1, 2, 2, 1, 4, 1, 2, 1, 1, 2, 2, 1].freeze,
185
+ [355, 2, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 2].freeze,
186
+ [354, 1, 2, 1, 2, 2, 1, 2, 1, 2, 1, 2, 1].freeze,
187
+ [384, 2, 1, 4, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
188
+ [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
189
+ [384, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 4, 2].freeze,
190
+ [354, 1, 2, 1, 1, 2, 1, 2, 1, 2, 2, 2, 1].freeze,
191
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2].freeze,
192
+ [384, 2, 2, 1, 2, 1, 5, 1, 1, 2, 2, 1, 2].freeze,
193
+ [354, 2, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
194
+ [354, 2, 2, 1, 2, 1, 2, 1, 2, 1, 1, 2, 1].freeze,
195
+ [384, 2, 2, 1, 2, 4, 2, 1, 2, 1, 2, 1, 1].freeze,
196
+ [355, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1].freeze,
197
+ [355, 2, 1, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2].freeze,
198
+ [384, 1, 4, 1, 2, 1, 2, 1, 2, 2, 2, 1, 2].freeze,
199
+ [354, 1, 2, 1, 1, 2, 1, 1, 2, 2, 1, 2, 2].freeze,
200
+ [384, 2, 1, 2, 1, 1, 2, 3, 2, 1, 2, 2, 2].freeze,
201
+ [354, 2, 1, 2, 1, 1, 2, 1, 1, 2, 1, 2, 2].freeze,
202
+ [354, 2, 1, 2, 2, 1, 1, 2, 1, 1, 2, 1, 2].freeze,
203
+ [384, 2, 1, 2, 2, 5, 1, 2, 1, 1, 2, 1, 2].freeze,
204
+ [354, 1, 2, 2, 1, 2, 2, 1, 2, 1, 2, 1, 1].freeze,
205
+ [355, 2, 1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 1].freeze
206
+ ].freeze
244
207
 
245
- matched = true
246
- break
247
- end
208
+ MAX_YEAR_NUMBER = 150
209
+ CALENDAR_YEAR_INFO_MAP = {
210
+ ko: KOREAN_LUNAR_YEAR_INFO
211
+ }.freeze
248
212
 
249
- days -= total
250
- target_month += 1
251
- end
252
- end
213
+ LUNARDAYS_FOR_MONTHTYPE = {
214
+ 1 => [29, 29, 0],
215
+ 2 => [30, 30, 0],
216
+ 3 => [58, 29, 29],
217
+ 4 => [59, 30, 29],
218
+ 5 => [59, 29, 30],
219
+ 6 => [60, 30, 30]
220
+ }.freeze
253
221
 
254
- break if matched
255
-
256
- days -= year_days
257
- start_year += 1
258
- end
259
-
260
- lunar_date = self.new(start_year, target_month + 1, days + 1, is_leap_month)
222
+ SOLAR_START_DATE = Date.new(1900, 1, 31).freeze
261
223
 
262
- return lunar_date
224
+ def initialize(year, month, day, is_leap_month = false)
225
+ self.year = year
226
+ self.month = month
227
+ self.day = day
228
+ self.is_leap_month = is_leap_month
263
229
  end
264
230
 
265
- def self.to_solar(year, month, day, is_leap_month = false)
266
- days = 0
267
- year_diff = year-1900
268
- year_info = self.year_info_map
231
+ class << self
232
+ private
269
233
 
270
- year_diff.times do |year_idx|
271
- days += year_info[year_idx][0]
234
+ def lunardays_for_type(month_type)
235
+ LUNARDAYS_FOR_MONTHTYPE[month_type]
272
236
  end
273
237
 
274
- (month-1).times do |month_idx|
275
- total, normal, leap = self.lunardays_for_type(year_info[year_diff][month_idx+1])
276
- days += total
238
+ def get_days(solar_date)
239
+ (solar_date - SOLAR_START_DATE).to_i
277
240
  end
278
241
 
279
- days += (day-1)
280
-
281
- if is_leap_month && year_info[year_diff][month] > 2
282
- days += self.lunardays_for_type(year_info[year_diff][month])[1]
242
+ def in_this_days?(days, left_days)
243
+ (days - left_days) < 0
283
244
  end
284
245
 
285
- solar_date = @start_date+days
246
+ def lunar_from_days(days, calendar_symbol)
247
+ start_year = 1900
248
+ target_month = 0
249
+ is_leap_month = false
250
+ matched = false
251
+ year_info = CALENDAR_YEAR_INFO_MAP[calendar_symbol]
286
252
 
287
- return solar_date
253
+ MAX_YEAR_NUMBER.times do |year_idx|
254
+ year_days = year_info[year_idx][0]
255
+ if in_this_days?(days, year_days)
256
+ 12.times do |month_idx|
257
+ total, normal, _leap = lunardays_for_type(year_info[year_idx][month_idx + 1])
258
+ if in_this_days?(days, total)
259
+ unless in_this_days?(days, normal)
260
+ days -= normal
261
+ is_leap_month = true
262
+ end
263
+
264
+ matched = true
265
+ break
266
+ end
267
+
268
+ days -= total
269
+ target_month += 1
270
+ end
271
+ end
272
+
273
+ break if matched
274
+
275
+ days -= year_days
276
+ start_year += 1
277
+ end
278
+
279
+ lunar_date = new(start_year, target_month + 1, days + 1, is_leap_month)
280
+
281
+ lunar_date
282
+ end
288
283
  end
289
- end
284
+ end
@@ -159,4 +159,18 @@ class TestRubyLunarDate < Minitest::Test
159
159
  assert_equal(solar_date.day, 8)
160
160
  assert_equal(solar_date.class, Date)
161
161
  end
162
- end
162
+
163
+ def test_lunar_spring_fesival
164
+ last_night_date = Date.new(2016, 2, 7).from_solar
165
+ assert_equal(last_night_date.year, 2015)
166
+ assert_equal(last_night_date.month, 12)
167
+ assert_equal(last_night_date.day, 29)
168
+ assert_equal(last_night_date.class, LunarDate)
169
+
170
+ spring_first_date = Date.new(2016, 1, 1).to_solar
171
+ assert_equal(spring_first_date.year, 2016)
172
+ assert_equal(spring_first_date.month, 2)
173
+ assert_equal(spring_first_date.day, 8)
174
+ assert_equal(spring_first_date.class, Date)
175
+ end
176
+ end
metadata CHANGED
@@ -1,16 +1,16 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ruby_lunardate
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - sunsidew
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-09-08 00:00:00.000000000 Z
11
+ date: 2016-03-14 00:00:00.000000000 Z
12
12
  dependencies: []
13
- description: 'Korean lunar, solar date two-way convert library '
13
+ description: 'Korean lunar date, solar date two-way convert library '
14
14
  email: sunsidew.yjw@gmail.com
15
15
  executables: []
16
16
  extensions: []