-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathholidaysSkCz.ts
More file actions
73 lines (65 loc) · 4.39 KB
/
Copy pathholidaysSkCz.ts
File metadata and controls
73 lines (65 loc) · 4.39 KB
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
/* Sviatky SR a ČR pre ľubovoľný rok (overené 07/2026).
SK: zákon 241/1993 Z. z. — 1.9. pracovný od 2024, 17.11. pracovný od 2025,
8.5. + 15.9. pracovné LEN v roku 2026 (zák. 261/2025).
CZ: zákon 245/2000 Sb. — všetkých 13 sviatkov je dňami pracovného pokoja
(Veľký piatok je sviatkom od 2016). */
export type Country = 'sk' | 'cz';
export interface HolidayInstance { date: Date; sk: string; en: string; rest: boolean }
type Def = { m: number; d: number; sk: string; en: string; rest: (y: number) => boolean };
const SK_FIXED: Def[] = [
{ m: 1, d: 1, sk: 'Deň vzniku SR', en: 'Establishment of the Slovak Republic', rest: () => true },
{ m: 1, d: 6, sk: 'Zjavenie Pána', en: 'Epiphany', rest: () => true },
{ m: 5, d: 1, sk: 'Sviatok práce', en: 'Labour Day', rest: () => true },
{ m: 5, d: 8, sk: 'Deň víťazstva nad fašizmom', en: 'Victory over Fascism Day', rest: (y) => y !== 2026 },
{ m: 7, d: 5, sk: 'Sv. Cyril a Metod', en: 'St. Cyril and Methodius', rest: () => true },
{ m: 8, d: 29, sk: 'Výročie SNP', en: 'SNP Anniversary', rest: () => true },
{ m: 9, d: 1, sk: 'Deň Ústavy SR', en: 'Constitution Day', rest: (y) => y < 2024 },
{ m: 9, d: 15, sk: 'Sedembolestná Panna Mária', en: 'Our Lady of Sorrows', rest: (y) => y !== 2026 },
{ m: 11, d: 1, sk: 'Sviatok všetkých svätých', en: "All Saints' Day", rest: () => true },
{ m: 11, d: 17, sk: 'Deň boja za slobodu a demokraciu', en: 'Freedom and Democracy Day', rest: (y) => y < 2025 },
{ m: 12, d: 24, sk: 'Štedrý deň', en: 'Christmas Eve', rest: () => true },
{ m: 12, d: 25, sk: 'Prvý sviatok vianočný', en: 'Christmas Day', rest: () => true },
{ m: 12, d: 26, sk: 'Druhý sviatok vianočný', en: "St. Stephen's Day", rest: () => true },
];
const CZ_FIXED: Def[] = [
{ m: 1, d: 1, sk: 'Nový rok / Deň obnovy českého štátu', en: 'New Year / Czech Statehood Restoration', rest: () => true },
{ m: 5, d: 1, sk: 'Sviatok práce', en: 'Labour Day', rest: () => true },
{ m: 5, d: 8, sk: 'Deň víťazstva', en: 'Victory Day', rest: () => true },
{ m: 7, d: 5, sk: 'Sv. Cyril a Metod', en: 'St. Cyril and Methodius', rest: () => true },
{ m: 7, d: 6, sk: 'Upálenie majstra Jána Husa', en: 'Jan Hus Day', rest: () => true },
{ m: 9, d: 28, sk: 'Deň českej štátnosti', en: 'Czech Statehood Day', rest: () => true },
{ m: 10, d: 28, sk: 'Vznik Československa', en: 'Founding of Czechoslovakia', rest: () => true },
{ m: 11, d: 17, sk: 'Deň boja za slobodu a demokraciu', en: 'Freedom and Democracy Day', rest: () => true },
{ m: 12, d: 24, sk: 'Štedrý deň', en: 'Christmas Eve', rest: () => true },
{ m: 12, d: 25, sk: '1. sviatok vianočný', en: 'Christmas Day', rest: () => true },
{ m: 12, d: 26, sk: '2. sviatok vianočný', en: "St. Stephen's Day", rest: () => true },
];
// Anonymous Gregorian algorithm — Easter Sunday (UTC)
export function easterSunday(y: number): Date {
const a = y % 19, b = Math.floor(y / 100), c = y % 100;
const d = Math.floor(b / 4), e = b % 4, f = Math.floor((b + 8) / 25), g = Math.floor((b - f + 1) / 3);
const h = (19 * a + b - d - g + 15) % 30;
const i = Math.floor(c / 4), k = c % 4;
const l = (32 + 2 * e + 2 * i - h - k) % 7;
const m = Math.floor((a + 11 * h + 22 * l) / 451);
const month = Math.floor((h + l - 7 * m + 114) / 31);
const day = ((h + l - 7 * m + 114) % 31) + 1;
return new Date(Date.UTC(y, month - 1, day));
}
export function holidaysForYear(y: number, country: Country): HolidayInstance[] {
const defs = country === 'sk' ? SK_FIXED : CZ_FIXED;
const es = easterSunday(y);
const gf = new Date(es); gf.setUTCDate(es.getUTCDate() - 2);
const em = new Date(es); em.setUTCDate(es.getUTCDate() + 1);
const list: HolidayInstance[] = defs.map((h) => ({
date: new Date(Date.UTC(y, h.m - 1, h.d)), sk: h.sk, en: h.en, rest: h.rest(y),
}));
list.push({ date: gf, sk: 'Veľký piatok', en: 'Good Friday', rest: true });
list.push({ date: em, sk: 'Veľkonočný pondelok', en: 'Easter Monday', rest: true });
return list.sort((a, b) => a.date.getTime() - b.date.getTime());
}
export const dkey = (d: Date) => `${d.getUTCFullYear()}-${d.getUTCMonth()}-${d.getUTCDate()}`;
/** Set of rest-day keys (rest holidays only, not weekends) for a year. */
export function restHolidaySet(y: number, country: Country): Set<string> {
return new Set(holidaysForYear(y, country).filter((h) => h.rest).map((h) => dkey(h.date)));
}