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.