// Zeller's Congruence implementation
// Returns the day of the week for a given date.
function dayOfWeek(d, m, y) {
// Zeller's output mapping:
// 0 = Saturday, 1 = Sunday, 2 = Monday, ... 6 = Friday
const names = [
"Saturday", "Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday"
];
// In Zeller's formula, January and February are counted
// as months 13 and 14 of the previous year.
if (m < 3) {
m += 12; // Convert Jan → 13, Feb → 14
y -= 1; // Move to previous year
}
const K = y % 100; // Year of the century (last two digits)
const J = Math.floor(y / 100); // Zero-based century (e.g., 2024 → 20)
// Zeller's formula (clearer step-by-step version):
const term1 = d; // day of month
const term2 = Math.floor(13 * (m + 1) / 5); // month adjustment
const term3 = K; // year of century
const term4 = Math.floor(K / 4); // leap years in century
const term5 = Math.floor(J / 4); // leap centuries
const term6 = 5 * J; // century correction
// Combine all terms and take modulo 7
const h = (term1 + term2 + term3 + term4 + term5 + term6) % 7;
// Return the corresponding weekday name
return names[h];
}
const d = 30, m = 5, y = 2024;
console.log(dayOfWeek(d, m, y));
/*
run:
Thursday
*/