Holidays

Canada Statutory Holidays Calculator

Canada's federally-recognized statutory holidays for any year, calculated live from the actual rules.

Federal list, not a provincial one

Canada's provinces and territories each set their own statutory holiday calendars, and they diverge significantly — Family Day exists in several provinces (on different dates in different ones) but not federally; some provinces don't recognize Boxing Day or the National Day for Truth and Reconciliation as a paid statutory holiday at all. This calculator shows the list that applies to federally regulated employees; check your specific province for the calendar that applies to most other workers.

A recent addition

The National Day for Truth and Reconciliation (September 30) has only been a federal statutory holiday since 2021, making it one of the newest entries on this list.

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 nthWeekday(year, month, weekday, n){ // month 0-indexed, weekday 0=Sun if(n === -1){ const last = new Date(Date.UTC(year, month+1, 0)); let d = last.getUTCDate(); while(new Date(Date.UTC(year, month, d)).getUTCDay() !== weekday) d--; return new Date(Date.UTC(year, month, d)); } const first = new Date(Date.UTC(year, month, 1)); const offset = (weekday - first.getUTCDay() + 7) % 7; return new Date(Date.UTC(year, month, 1 + offset + (n-1)*7)); } function canadaHolidays(year){ const easter = computeEaster(year); const goodFriday = new Date(easter); goodFriday.setUTCDate(easter.getUTCDate()-2); // Victoria Day: Monday on or before May 24 let victoria = new Date(Date.UTC(year,4,24)); while(victoria.getUTCDay() !== 1) victoria.setUTCDate(victoria.getUTCDate()-1); const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Good Friday', goodFriday], ['Victoria Day', victoria], ['Canada Day', new Date(Date.UTC(year,6,1))], ['Labour Day', nthWeekday(year,8,1,1)], ['National Day for Truth and Reconciliation', new Date(Date.UTC(year,8,30))], ['Thanksgiving', nthWeekday(year,9,1,2)], ['Remembrance Day', new Date(Date.UTC(year,10,11))], ['Christmas Day', new Date(Date.UTC(year,11,25))], ['Boxing Day', new Date(Date.UTC(year,11,26))], ]; return raw.map(([name,date]) => ({name, date, observed: 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 = canadaHolidays(year); table.innerHTML = rows.map(r => { let obsHtml = ''; if(r.observed && r.observed.getTime() !== r.date.getTime()){ obsHtml = ` (observed ${fmt(r.observed)})`; } return `
${r.name}${fmt(r.date)}${obsHtml}
`; }).join(''); } yearSelect.addEventListener('change', render); render();