Holidays

France Public Holidays Calculator

France's public holidays (jours feries) for any year, calculated live from the actual rules.

Notably few Easter-linked holidays

Unlike Germany or the UK, France only ties two of its eleven national holidays to Easter (Easter Monday and Ascension Day) — the rest fall on fixed calendar dates. That makes France's holiday calendar one of the more predictable in Europe from year to year, since most dates never move.

No automatic day off if a holiday falls on a weekend

Unlike the US federal system or UK bank holidays, France has no standard "observed on the nearest weekday" rule — if a jour ferie lands on a Saturday or Sunday, it's simply absorbed into the weekend with no substitute day added, which is a genuine source of year-to-year variation in how many actual non-weekend days off workers get.

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 franceHolidays(year){ const easter = computeEaster(year); const easterMonday = new Date(easter); easterMonday.setUTCDate(easter.getUTCDate()+1); const ascension = new Date(easter); ascension.setUTCDate(easter.getUTCDate()+39); const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Easter Monday', easterMonday], ['Labour Day', new Date(Date.UTC(year,4,1))], ['Victory in Europe Day', new Date(Date.UTC(year,4,8))], ['Ascension Day', ascension], ['Bastille Day', new Date(Date.UTC(year,6,14))], ['Assumption of Mary', new Date(Date.UTC(year,7,15))], ['All Saints\' Day', new Date(Date.UTC(year,10,1))], ['Armistice Day', new Date(Date.UTC(year,10,11))], ['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 = franceHolidays(year); table.innerHTML = rows.map(r => `
${r.name}${fmt(r.date)}
`).join(''); } yearSelect.addEventListener('change', render); render();