Holidays

Germany Public Holidays Calculator

Germany's nationwide public holidays for any year, calculated live from the actual rules.

Nationwide vs. state holidays

Only a handful of holidays are observed across all 16 German states — Germany has one of the most state-fragmented holiday calendars in Europe. Catholic-majority states like Bavaria and Saarland add several additional religious holidays (Epiphany, Corpus Christi, All Saints' Day) that Protestant-majority and secular states like Berlin or Hamburg don't observe at all. This calculator shows the holidays common to every state; check your specific Bundesland for its complete list.

A recent addition

International Women's Day (March 8) became a state holiday in Berlin in 2019, and in Mecklenburg-Vorpommern in 2023 — it is not nationwide, but shows how the state-level list keeps evolving separately from the federal one.

Related

Related tools

function computeEaster(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(Date.UTC(year, month-1, day)); } function germanyHolidays(year){ const easter = computeEaster(year); const goodFriday = new Date(easter); goodFriday.setUTCDate(easter.getUTCDate()-2); const easterMonday = new Date(easter); easterMonday.setUTCDate(easter.getUTCDate()+1); const ascension = new Date(easter); ascension.setUTCDate(easter.getUTCDate()+39); const whitMonday = new Date(easter); whitMonday.setUTCDate(easter.getUTCDate()+50); const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Good Friday', goodFriday], ['Easter Monday', easterMonday], ['Labour Day', new Date(Date.UTC(year,4,1))], ['Ascension Day', ascension], ['Whit Monday', whitMonday], ['German Unity Day', new Date(Date.UTC(year,9,3))], ['Christmas Day', new Date(Date.UTC(year,11,25))], ['Boxing Day (2. Weihnachtstag)', new Date(Date.UTC(year,11,26))], ]; return raw.map(([name,date]) => ({name, date})); } const now = new Date(); for(let y = now.getFullYear()-1; y <= now.getFullYear()+3; y++){ const opt = document.createElement('option'); opt.value = y; opt.textContent = y; if(y === now.getFullYear()) opt.selected = true; document.getElementById('hlYear').appendChild(opt); } const yearSelect = document.getElementById('hlYear'); const table = document.getElementById('hlTable'); function fmt(d){ return d.toLocaleDateString('en-US',{weekday:'short', month:'long', day:'numeric'}); } function render(){ const year = parseInt(yearSelect.value,10); const rows = germanyHolidays(year); table.innerHTML = rows.map(r => `
${r.name}${fmt(r.date)}
`).join(''); } yearSelect.addEventListener('change', render); render();