-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathnb_NO.go
344 lines (278 loc) · 8.28 KB
/
nb_NO.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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
package kal
// locale: nb_NO
// Anything that's specific to Norway, with the exception of some movable dates which are in movable.go
// This calendar has a corresponding locale code in the NewCalendar function in calendar.go
// Use this as a template for implementing other languages and locales
import (
"strings"
"time"
)
type NorwegianCalendar struct{}
// Create a new Norwegian calendar
func NewNorwegianCalendar() NorwegianCalendar {
return NorwegianCalendar{}
}
// Finds the Norwegian name for a day of the week.
// Note that time.Weekday starts at 0 with Sunday, not Monday.
func (nc NorwegianCalendar) DayName(day time.Weekday) string {
return []string{"søndag", "mandag", "tirsdag", "onsdag", "torsdag", "fredag", "lørdag"}[int(day)]
}
// Finds the Norwegian name for a given month
func (nc NorwegianCalendar) MonthName(month time.Month) string {
return []string{"januar", "februar", "mars", "april", "mai", "juni", "juli", "august", "september", "oktober", "november", "desember"}[int(month)-1]
}
// Checks if a given date is a "red day" (public holiday) in the Norwegian calendar.
// Returns true/false, a description and true/false for if it's a flag day.
// The dates will never overlap.
// Includes the 24th of December, even though only half the day is red.
func (nc NorwegianCalendar) RedDay(date time.Time) (bool, string, bool) {
// Source: http://www.diskusjon.no/index.php?showtopic=1084239
// Source: http://no.wikipedia.org/wiki/Helligdager_i_Norge
var (
desc string
flag bool
)
// Sundays
if date.Weekday() == time.Sunday {
desc = "Søndag"
}
// Første nyttårsdag, 1. januar
if atMD(date, 1, 1) {
desc = "Første nyttårsdag"
flag = true
}
// Palmesøndag
if atPalmSunday(date) {
desc = "Palmesøndag"
}
// Skjærtorsdag (easter - 3d)
if atEasterPlus(date, -3) {
desc = "Skjærtorsdag"
}
// Langfredag (easter - 2d)
if atEasterPlus(date, -2) {
desc = "Langfredag"
}
// Første påskedag
if atEasterPlus(date, 0) {
desc = "Første påskedag"
flag = true
}
// Andre påskedag (easter + 1d)
if atEasterPlus(date, 1) {
desc = "Andre påskedag"
}
// Arbeidernes internasjonale kampdag, 1. mai
if atMD(date, 5, 1) {
// Arbeiderbevegelsens dag
desc = "Arbeidernes internasjonale kampdag"
flag = true
}
// Grunnlovsdagen, 17. mai
if atMD(date, 5, 17) {
// Norges grunnlovsdag/nasjonaldagen
desc = "Grunnlovsdagen"
flag = true
}
// Kristi himmelfartsdag (40. påskedag: easter + 39d)
if atEasterPlus(date, 39) {
desc = "Kristi himmelfartsdag"
}
// Første pinsedag (50. påskedag: easter + 49d)
if atEasterPlus(date, 49) {
desc = "Første pinsedag"
flag = true
}
// Andre pinsedag (51. påskedag: easter + 50d)
if atEasterPlus(date, 50) {
desc = "Andre pinsedag"
}
// Julaften, halv-rød dag!
if atMD(date, 12, 24) {
desc = "Julaften (halv dag)"
}
// Første juledag (25. desember)
if atMD(date, 12, 25) {
desc = "Første juledag"
flag = true
}
// Andre juledag (26. desember)
if atMD(date, 12, 26) {
desc = "Andre juledag"
}
// Red days
if desc != "" {
// Then return
return true, desc, flag
}
// Normal days
return false, desc, false
}
// Some days are not red, but special in one way or another.
// Checks if a given date is notable. Returns true/false if the
// given date is notable, a comma separated description (in case there are more
// than one notable event that day) and true/false depending on if it's a flag
// flying day or not.
func (nc NorwegianCalendar) NotableDay(date time.Time) (bool, string, bool) {
// Source: http://www.timeanddate.no/kalender/merkedag-innhold
// Source: http://no.wikipedia.org/wiki/Norges_offisielle_flaggdager
var (
descriptions []string
flag bool
)
// Since days may overlap, "flaggdager" must come first for the flag
// flying days to be correct.
// --- Flag days ---
// Frigjøringsdagen
if atMD(date, 5, 8) {
// Frigjøringsdag 1945
descriptions = append(descriptions, "Frigjøringsdagen")
flag = true
}
// Samefolkets dag
if atMD(date, 2, 6) {
descriptions = append(descriptions, "Samefolkets dag")
flag = true
}
// 21 januar, H.K.H. Prinsesse Ingrid Alexandras fødselsdag
if atMD(date, 1, 21) {
descriptions = append(descriptions, "H.K.H. Prinsesse Ingrid Alexandras fødselsdag")
flag = true
}
// 21 februar, H.M. Kong Harald Vs fødselsdag
if atMD(date, 2, 21) {
descriptions = append(descriptions, "H.M. Kong Harald Vs fødselsdag")
flag = true
}
// 7 juni, unionsoppløsningen med Sverige i 1905
if atMD(date, 6, 7) {
descriptions = append(descriptions, "Unionsoppløsningen med Sverige i 1905")
flag = true
}
// 4 juli, H.M. Dronning Sonjas fødselsdag
if atMD(date, 7, 4) {
descriptions = append(descriptions, "H.M. Dronning Sonjas fødselsdag")
flag = true
}
// 20 juli, H.K.H. Kronprins Haakon Magnus' fødselsdag
if atMD(date, 7, 20) {
descriptions = append(descriptions, "H.K.H. Kronprins Haakon Magnus' fødselsdag")
flag = true
}
// 29. juli, Olsokdagen
if atMD(date, 7, 29) {
descriptions = append(descriptions, "Olsokdagen")
flag = true
}
// 19. aug, H.K.H. Kronprinsesse Mette Marits fødselsdag
if atMD(date, 8, 19) {
descriptions = append(descriptions, "H.K.H. Kronprinsesse Mette Marits fødselsdag")
flag = true
}
// 9. sept hvert 4. år, 2013, 2017 osv, Stortingsvalg-dagen
if (date.Year()-1)%4 == 0 {
if atMD(date, 9, 9) {
descriptions = append(descriptions, "Stortingsvalg-dagen")
flag = true
}
}
// --- Non-flag days ---
// Askeonsdag (fasten begynner)
if atEasterPlus(date, -46) {
descriptions = append(descriptions, "Askeonsdag")
}
// Påskeaften (fasten slutter)
if atEasterPlus(date, -1) {
descriptions = append(descriptions, "Påskeaften")
}
// Fastelavnssøndag (første dag i fastelavn, festen før fasten)
// Source: http://www.aktivioslo.no/hvaskjer/fastelavn/
if atEasterPlus(date, -49) {
descriptions = append(descriptions, "Fastelavnsøndag")
}
// Blåmandag (andre dag i fastelavn)
if atEasterPlus(date, -48) {
descriptions = append(descriptions, "Blåmandag")
}
// Feitetirsdag (tredje og siste dag i fastelavn, også kjent som Mardi Gras)
if atEasterPlus(date, -47) {
descriptions = append(descriptions, "Feitetirsdag (Mardi Gras)")
}
// Sankthansaften
if atMD(date, 6, 23) {
descriptions = append(descriptions, "Sankthansaften")
}
// Nyttårsaften
if atMD(date, 12, 31) {
descriptions = append(descriptions, "Nyttårsaften")
}
// Morsdag
if atMorsdag(date) {
descriptions = append(descriptions, "Morsdag")
}
// Farsdag
if atFarsdag(date) {
descriptions = append(descriptions, "Farsdag")
}
// Valentinsdagen
if atMD(date, 2, 14) {
descriptions = append(descriptions, "Valentinsdagen")
}
// Allehelgensaften (Halloween)
if atMD(date, 10, 31) {
descriptions = append(descriptions, "Allehelgensaften (Halloween)")
}
// Allehelgensdag
if atMD(date, 11, 1) {
descriptions = append(descriptions, "Allehelgensdag")
}
// Vårjevndøgn
if atNorthwardEquinox(date) {
descriptions = append(descriptions, "Vårjevndøgn")
}
// Sommersolverv
if atNorthernSolstice(date) {
descriptions = append(descriptions, "Sommersolverv")
}
// Høstjevndøgn
if atSouthwardEquinox(date) {
descriptions = append(descriptions, "Høstjevndøgn")
}
// Vintersolverv
if atSouthernSolstice(date) {
descriptions = append(descriptions, "Vintersolverv")
}
// Siste søndag i mars, sommertid, klokka stilles 1 time frem
if atSommertid(date) {
descriptions = append(descriptions, "Sommertid (+1t)")
}
// Siste søndag i oktober, vintertid, klokka stilles 1 time tilbake
if atVintertid(date) {
descriptions = append(descriptions, "Vintertid (-1t)")
}
// If there are notable events, return them as a string
if len(descriptions) > 0 {
desc := strings.Join(descriptions, ", ")
// Then return
return true, desc, flag
}
// No notable events
return false, "", false
}
// Checks if a given date is in a notable time range (summer holidays, for instance)
func (nc NorwegianCalendar) NotablePeriod(date time.Time) (bool, string) {
// TODO:
// uke 28, 29 og 30, fellesferie
// jul
// fastelavn
// faste
// sommer/vinter/vår/høst (legg denne først i listen)
return false, ""
}
func (nc NorwegianCalendar) MondayFirst() bool {
return true
}
// An ordinary day
func (nc NorwegianCalendar) NormalDay() string {
return "Hverdag"
}