Holidays

Japan Public Holidays Calculator

Japan's national holidays for any year, calculated live — including several deliberately shifted to always land on a Monday.

The "Happy Monday System"

Since a set of reforms starting in 2000, Japan deliberately defines several holidays as "the Nth Monday of [month]" rather than a fixed date, specifically to guarantee a long weekend every time — Coming of Age Day, Marine Day, Respect for the Aged Day, and Health and Sports Day are all defined this way. It's a rare example of a country explicitly redesigning its holiday calendar around creating three-day weekends rather than tradition or religious observance.

The substitute holiday rule

If a fixed-date holiday falls on a Sunday, the following Monday becomes a substitute holiday (furikae kyujitsu) — similar in spirit to the UK's substitute-day system, but specifically triggered by a Sunday collision rather than any weekend day.

Related

Related tools

function nthWeekday(year, month, weekday, n){ 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 japanHolidays(year){ const raw = [ ['New Year\'s Day', new Date(Date.UTC(year,0,1))], ['Coming of Age Day', nthWeekday(year,0,1,2)], ['National Foundation Day', new Date(Date.UTC(year,1,11))], ['Emperor\'s Birthday', new Date(Date.UTC(year,1,23))], ['Showa Day', new Date(Date.UTC(year,3,29))], ['Constitution Memorial Day', new Date(Date.UTC(year,4,3))], ['Greenery Day', new Date(Date.UTC(year,4,4))], ['Children\'s Day', new Date(Date.UTC(year,4,5))], ['Marine Day', nthWeekday(year,6,1,3)], ['Mountain Day', new Date(Date.UTC(year,7,11))], ['Respect for the Aged Day', nthWeekday(year,8,1,3)], ['Health and Sports Day', nthWeekday(year,9,1,2)], ['Culture Day', new Date(Date.UTC(year,10,3))], ['Labor Thanksgiving Day', new Date(Date.UTC(year,10,23))], ]; 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 = japanHolidays(year); table.innerHTML = rows.map(r => `
${r.name}${fmt(r.date)}
`).join(''); } yearSelect.addEventListener('change', render); render();