Krok 8: wszystkie święta roku
Kalendarz ze świętami, notatkami i językami - Kalendarz w JavaScript krok po kroku (JavaScript)
`holidaysOf(year)` skleja święta stałe (bez Wigilii przed 2025, pole `since`) i ruchome w jedną listę `{ date, name }` posortowaną po dacie (`x.date - y.date` odejmuje daty jako liczby milisekund). To gotowy model świąt dla kalendarza.
const WEEKDAYS = ['niedziela', 'poniedziałek', 'wtorek', 'środa', 'czwartek', 'piątek', 'sobota'];
const pad = n => String(n).padStart(2, '0');
const fmt = date => `${pad(date.getDate())}.${pad(date.getMonth() + 1)}`;
const FIXED_HOLIDAYS = [
{ month: 1, day: 1, name: 'Nowy Rok' },
{ month: 1, day: 6, name: 'Trzech Króli' },
{ month: 5, day: 1, name: 'Święto Pracy' },
{ month: 5, day: 3, name: 'Święto Konstytucji 3 Maja' },
{ month: 8, day: 15, name: 'Wniebowzięcie NMP' },
{ month: 11, day: 1, name: 'Wszystkich Świętych' },
{ month: 11, day: 11, name: 'Święto Niepodległości' },
{ month: 12, day: 24, name: 'Wigilia', since: 2025 }, // dzień wolny od 2025 roku
{ month: 12, day: 25, name: 'Boże Narodzenie' },
{ month: 12, day: 26, name: 'Drugi dzień Bożego Narodzenia' },
];
// algorytm Meeusa (Jonesa-Butchera): Wielkanoc dla dowolnego roku kalendarza gregoriańskiego
function easter(year) {
const a = year % 19;
const b = Math.floor(year / 100);
const c = year % 100;
const d = Math.floor(b / 4);
const e = b % 4;
const f = Math.floor((b + 8) / 25);
const g = Math.floor((b - f + 1) / 3);
const h = (19 * a + b - d - g + 15) % 30;
const i = Math.floor(c / 4);
const 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(year, month - 1, day);
}
// Date sam przenosi nadmiar dni do kolejnego miesiąca
const addDays = (date, n) => new Date(date.getFullYear(), date.getMonth(), date.getDate() + n);
const MOVABLE_HOLIDAYS = [
{ offset: 0, name: 'Wielkanoc' },
{ offset: 1, name: 'Poniedziałek Wielkanocny' },
{ offset: 49, name: 'Zielone Świątki' }, // 50. dzień licząc od Wielkanocy
{ offset: 60, name: 'Boże Ciało' }, // czwartek po niedzieli Trójcy Świętej
];
// wszystkie święta roku jako lista { date, name } posortowana po dacie
function holidaysOf(year) {
const fixed = FIXED_HOLIDAYS.filter(h => !h.since || year >= h.since)
.map(h => ({ date: new Date(year, h.month - 1, h.day), name: h.name }));
const sunday = easter(year);
const movable = MOVABLE_HOLIDAYS.map(h => ({ date: addDays(sunday, h.offset), name: h.name }));
return [...fixed, ...movable].sort((x, y) => x.date - y.date);
}
for (const year of [2024, 2026]) {
console.log(`Święta ${year}:`);
for (const h of holidaysOf(year)) {
console.log(` ${fmt(h.date)} ${WEEKDAYS[h.date.getDay()]}: ${h.name}`);
}
}Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.
Wszystkie lekcje kursu Kalendarz w JavaScript krok po kroku·Zaloguj się, aby zapisać postęp na koncie.