Krok 9: kalendarz konsolowy ze świętami
Kalendarz ze świętami, notatkami i językami - Kalendarz w JavaScript krok po kroku (JavaScript)
Kalendarz z lekcji pierwszej dostaje święta: `Map` z kluczem daty `2026-05-03` pozwala w pętli dni od razu sprawdzić, czy dzień jest świętem, bez przeszukiwania listy. Święto ma wykrzyknik zamiast spacji, a pod kalendarzem jest lista nazw.
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);
}
const key = date => `${date.getFullYear()}-${pad(date.getMonth() + 1)}-${pad(date.getDate())}`;
function printMonth(year, month) {
const holidays = new Map(holidaysOf(year).map(h => [key(h.date), h.name]));
const firstDay = (new Date(year, month - 1, 1).getDay() + 6) % 7;
const days = new Date(year, month, 0).getDate();
console.log('Pn Wt Śr Cz Pt So Nd');
let line = ' '.repeat(firstDay);
const names = [];
for (let i = 1; i <= days; i++) {
const name = holidays.get(key(new Date(year, month - 1, i)));
line += String(i).padStart(2) + (name ? '!' : ' ');
if (name) names.push(`${pad(i)}.${pad(month)} ${name}`);
if ((firstDay + i) % 7 === 0) {
console.log(line);
line = '';
}
}
if (line !== '') console.log(line);
for (const n of names) console.log('! ' + n);
}
printMonth(2026, 5);Ł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.