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.