Holidays

Spain Public Holidays Calculator

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

Three layers of holidays

Spain's public holidays are set at three levels: a short national list observed everywhere, additional holidays chosen by each of the 17 autonomous communities, and further local holidays set by individual municipalities. This calculator shows the national layer only — an actual working calendar for any specific city typically has 2-4 more days added on top.

Why some years feel like they have fewer real days off

Unlike France, Spain has no standard nationwide rule shifting a holiday when it falls on a weekend — some autonomous communities add a substitute "puente" (bridge) day locally, but this varies by region rather than being a fixed national policy, making the actual number of usable days off genuinely different depending on where in Spain you are.

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 spainHolidays(year){ const easter = computeEaster(year); const goodFriday = new Date(easter); goodFriday.setUTCDate(easter.getUTCDate()-2); const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Epiphany', new Date(Date.UTC(year,0,6))], ['Good Friday', goodFriday], ['Labour Day', new Date(Date.UTC(year,4,1))], ['Assumption of Mary', new Date(Date.UTC(year,7,15))], ['National Day', new Date(Date.UTC(year,9,12))], ['All Saints\' Day', new Date(Date.UTC(year,10,1))], ['Constitution Day', new Date(Date.UTC(year,11,6))], ['Immaculate Conception', new Date(Date.UTC(year,11,8))], ['Christmas Day', new Date(Date.UTC(year,11,25))], ]; 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 = spainHolidays(year); table.innerHTML = rows.map(r => `
${r.name}${fmt(r.date)}
`).join(''); } yearSelect.addEventListener('change', render); render();