-
Notifications
You must be signed in to change notification settings - Fork 5
/
jpholiday.go
236 lines (219 loc) · 4.52 KB
/
jpholiday.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
package jpholiday
import (
"math"
"time"
)
var JST = time.FixedZone("JST", 3600*9)
func Name(t time.Time) string {
t = t.In(JST)
y, m, d, w := toYMDW(t)
name := getName(y, m, d, w)
//振替休日
if len(name) <= 0 {
if w == 0 && (y >= 1974 || (y == 1973 && m >= 4)) {
yname := getYesterdayNameFromTime(t)
if len(yname) >= 1 {
name = "振替休日"
}
} else if m == 5 && d == 6 && 2007 <= y && 1 <= w && w <= 2 {
name = "振替休日"
}
}
return name
}
func toYMDW(t time.Time) (int, int, int, int) {
y, m, d := t.Date()
return y, int(m), d, (int(t.Weekday()) + 6) % 7
}
func getYesterdayNameFromTime(t time.Time) string {
yesterday := t.AddDate(0, 0, -1)
y, m, d, w := toYMDW(yesterday)
return getName(y, m, d, w)
}
func getName(y, m, d, w int) string {
//皇室慶弔行事に伴う休日
if y == 1959 && m == 4 && d == 10 {
return "皇太子・明仁親王の結婚の儀"
} else if y == 1989 && m == 2 && d == 24 {
return "昭和天皇の大喪の礼"
} else if y == 1990 && m == 11 && d == 12 {
return "即位の礼正殿の儀"
} else if y == 1993 && m == 6 && d == 9 {
return "皇太子・徳仁親王の結婚の儀"
}
if y == 2019 {
if m == 4 && d == 30 {
return "国民の休日"
} else if m == 5 {
if d == 1 {
return "天皇の即位"
} else if d == 2 {
return "国民の休日"
}
} else if m == 10 && d == 22 {
return "即位礼正殿の儀"
}
}
// 東京オリンピック 特別措置法
if y == 2020 {
if m == 7 {
if d == 23 {
return "海の日"
} else if d == 24 {
return "スポーツの日"
}
} else if m == 8 {
if d == 10 {
return "山の日"
}
}
}
// 東京オリンピック 特別措置法
if y == 2021 {
if m == 7 {
if d == 22 {
return "海の日"
} else if d == 23 {
return "スポーツの日"
}
} else if m == 8 {
if d == 8 {
return "山の日"
}
}
}
//国民の祝日
if m == 1 {
if d == 1 {
return "元日"
} else {
if 1949 <= y && y <= 1999 {
if d == 15 {
return "成人の日"
}
} else if 2000 <= y {
if 8 <= d && d <= 14 && w == 0 {
return "成人の日"
}
}
}
} else if m == 2 {
if 1967 <= y {
if d == 11 {
return "建国記念の日"
}
}
if 2020 <= y && d == 23 {
return "天皇誕生日"
}
} else if m == 3 {
if 19 <= d && d <= 22 {
if d == shunBunDay(y) {
return "春分の日"
}
}
} else if m == 4 {
if d == 29 {
if y <= 1988 {
return "天皇誕生日"
} else if y <= 2006 {
return "みどりの日"
} else {
return "昭和の日"
}
}
} else if m == 5 {
if d == 3 {
return "憲法記念日"
} else if d == 4 {
if 1988 <= y && y <= 2006 && 1 <= w && w <= 5 {
return "国民の休日"
} else if 2007 <= y {
return "みどりの日"
}
} else if d == 5 {
return "こどもの日"
}
} else if m == 7 {
if 1996 <= y && y <= 2002 {
if d == 20 {
return "海の日"
}
} else if 2003 <= y {
if 15 <= d && d <= 21 && w == 0 && y != 2020 && y != 2021 {
return "海の日"
}
}
} else if m == 8 {
if 2016 <= y {
if d == 11 && y != 2020 && y != 2021 {
return "山の日"
}
}
} else if m == 9 {
if 1966 <= y && y <= 2002 {
if d == 15 {
return "敬老の日"
}
} else if 2003 <= y {
if 15 <= d && d <= 21 && w == 0 {
return "敬老の日"
}
}
if 2009 <= y && w == 1 {
if 21 <= d && d <= 23 {
if d+1 == shuuBunDay(y) {
return "国民の休日"
}
}
}
if 22 <= d && d <= 24 {
if d == shuuBunDay(y) {
return "秋分の日"
}
}
} else if m == 10 {
if 1966 <= y && y <= 1999 {
if d == 10 {
return "体育の日"
}
} else if 2000 <= y {
if 8 <= d && d <= 14 && w == 0 && y != 2020 && y != 2021 {
if 2020 <= y {
return "スポーツの日"
}
return "体育の日"
}
}
} else if m == 11 {
if d == 3 {
return "文化の日"
} else if d == 23 {
return "勤労感謝の日"
}
} else if m == 12 {
if 1989 <= y && y <= 2018 && d == 23 {
return "天皇誕生日"
}
}
return ""
}
func calcDay(future, present, past float64, y int) int {
add := 0.242194*float64(y-1980) - math.Floor(float64(y-1980)/4.0)
val := 0.0
switch {
case 2100 <= y && y <= 2150:
val = future + add
case 1980 <= y:
val = present + add
case 1900 <= y:
val = past + add
}
return int(math.Floor(val))
}
func shunBunDay(y int) int {
return calcDay(21.8519, 20.8431, 20.8357, y)
}
func shuuBunDay(y int) int {
return calcDay(24.2488, 23.2488, 23.2588, y)
}