Krok 7: święta ruchome liczone od Wielkanocy

Kalendarz ze świętami, notatkami i językami - Kalendarz w JavaScript krok po kroku (JavaScript)

Pozostałe święta ruchome są w stałej odległości od Wielkanocy: Poniedziałek Wielkanocny +1 dzień, Zielone Świątki to 50. dzień licząc z Wielkanocą (+49), Boże Ciało czwartek po niedzieli Trójcy Świętej (+60). Odległości trafiają do tablicy, a `addDays` dodaje dni przez konstruktor `Date` (nadmiar przechodzi na kolejny miesiąc). Dni tygodnia w wyniku sprawdzają mechanizm: niedziela, poniedziałek, niedziela, czwartek.

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)}`;
// 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
];
const year = 2026;
const sunday = easter(year);
for (const h of MOVABLE_HOLIDAYS) {
  const date = addDays(sunday, h.offset);
  console.log(`${fmt(date)} ${WEEKDAYS[date.getDay()]}: ${h.name} (+${h.offset})`);
}

Ł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.