La Congruencia de Zeller, modificada para las convenciones informáticas modernas, proporciona un algoritmo sencillo para determinar el día de la semana para cualquier día del Calendario Gregoriano, que entró en uso en 1582. La variación más sencilla de la fórmula es la siguiente
h = (d + ((m+1)*26)/10 + y + y/4 + 6 * (y/100) + y/400 + 5) % 7 + 1; donde d es el día del mes, m es el mes, y es el año de cuatro dígitos, y el resultado utiliza las convenciones de días de la semana de la ISO: 1=lunes a 7=domingo.
Todas las operaciones de división deben utilizar la división entera (truncada). Esta variante sólo utiliza coeficientes positivos, por lo que evita el problema de los resultados negativos que aparecen en otras variantes.
El mes y el año deben tratarse de forma diferente para los dos primeros meses del año. Enero y febrero deben tratarse como los meses 13 y 14 del año anterior. Así que el primer mes se convierte en marzo, con un valor de 3. Una implementación en Java podría ser así:
/**
* Calculate the day of the week for a given date of the Gregorian Calendar.
* @param year The four-digit year
* @param month The month, from 1 (January) to 12 (December)
* @param dayOfMonth The day of the month.
* @return An ISO-compliant day of the week, where 1 = Monday and 7 = Sunday.
*/
public final int dayOfWeek(int year, int month, int dayOfMonth) {
assert year > 1582 : "Four digit year required: " + year;
int y = year;
if (month < 3) {
month += 12;
y--;
}
return (dayOfMonth + ((month+1)*26)/10 + y + y/4 + 6 * (y/100) + y/400 + 5) % 7 + 1;
}
Se puede encontrar un artículo completo sobre la fórmula en la página de Wikipedia Congruencia de Zeller artículo
12 votos
es.wikipedia.org/wiki/Regla del Juicio Final
1 votos
De hecho, enseño este algoritmo en mi clase de algoritmos; ¡es útil en la vida real poder hacerlo!
0 votos
Dershowitz/Reingold es el libro de referencia para este tipo de temas.
0 votos
Me pregunto si el algoritmo de O'Beirne ( sixthform.info/maths/?p=155 ) para encontrar la fecha del Domingo de Resurrección se basa (al menos parcialmente) en ésta.
0 votos
Ah, Conway "Lo siento, estoy acostumbrado a decir "nada". Intentaré decir "cero". (pausa) No, no lo intentaré. Pueden aprender a ser traviesos".