// 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
$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
}
$K = $y % 100; // Year of the century (last two digits)
$J = intdiv($y, 100); // Zero-based century (e.g., 2024 → 20)
// Zeller's formula (clearer step-by-step version):
$term1 = $d; // day of month
$term2 = intdiv(13 * ($m + 1), 5); // month adjustment
$term3 = $K; // year of century
$term4 = intdiv($K, 4); // leap years in century
$term5 = intdiv($J, 4); // leap centuries
$term6 = 5 * $J; // century correction
// Combine all terms and take modulo 7
$h = ($term1 + $term2 + $term3 + $term4 + $term5 + $term6) % 7;
// Return the corresponding weekday name
return $names[$h];
}
$d = 30;
$m = 5;
$y = 2024;
echo dayOfWeek($d, $m, $y), PHP_EOL;
/*
run:
Thursday
*/