La congruencia de Zeller y cómo calcular el día del cambio horario

Cambio de hora

Cambio de hora

En poco más de una semana llegará el tan denostado y ultrajado cambio al horario de verano que muchos países del mundo (hay muchísimos que ni se lo plantean, ni se lo van a plantear) realizan para volver locos a sus ciudadanos y con la intención de ahorrar (¿?) un poquito en el tema energético. El cambio horario fue una medida que se implantó por primera vez durante la Primera Guerra Mundial, cuando algunos de los países implicados la adoptaron con la finalidad de ahorrar combustible. Esta situación se repitió en 1973, durante la crisis del petróleo, en la cual la mayoría de los países industrializados adoptaran la misma medida para hacer frente a la complicada situación.

No vamos a entrar en la eterna discusión de si esto tiene o no algún sentido, pues nosotros nos vamos a centrar en el tema tecnológico geek del asunto, en el fundamento friki del algoritmo que hace que nuestros ordenadores, teléfonos, televisores, relojes y demás gadgets se actualicen automáticamente.

La verdad es que, hoy día, los diversos sistemas operativos fundamentan sus cambios horarios en el manejo de bases de datos cooperativas mundiales que almacenan toda la información de las características horarias de cada país y sus circunstancias particulares. Y es que no todos somos iguales, y algunos somos muy, pero que muy, raritos. Por poner tres ejemplos simples: primero, en España manejamos un huso horario que no nos corresponde (reminiscencias franquistas desde 1942); segundo, en Brasil sólo cambian la hora en el sur del país; tercero, en Israel, hasta 2005 el horario cambiaba una vez al año. Y así podríamos seguir un buen rato.

La base de datos más utilizada para estos menesteres es la llamada TZ Database, más conocida como Zoneinfo Database, que procura registrar todos los cambios en zonas horarias, ajustes verano/invierno e, inclusive, las correcciones de segundos astronómicas desde 1970. Es el procedimiento utilizado por la mayoría de los sistemas operativos descendientes de Unix, por aquellos derivados de BSD, por los lenguajes de programación más extendidos y por la mayoría de sistemas de gestión de datos. Por otro lado, HP dispone de una base de datos propia (llamada tztab) que es similar pero incompatible. El otro gran sistema es el propietario de los entornos operativos Microsoft Windows y sus servidores horarios en Internet.

Al margen de todo ello, y olvidándonos de estas bases de datos, aquí vamos a imaginar que no existieran y que nosotros tuviéramos que calcular el día en que se debe cambiar la hora o, más concretamente, si el día en el que estamos es el del cambio de hora (que es lo que hacen los computadores). La estandarización internacional llegó hace tiempo a la conclusión de que esto se realizaría el último domingo de marzo (horario de verano) y el último domingo de octubre (horario de invierno). ¿Cómo calcular de manera informática, pues, cuáles son los últimos domingos de marzo y octubre?

La lógica de nuestras rápidas mentes de desarrollares nos puede llevar a pensar lo siguiente (caso de marzo): pregunto si hoy es marzo; si lo es, pregunto si hoy es domingo; si lo es, calculo el día de hoy más siete; si es abril, hoy es el último domingo de marzo. Por ejemplo.

Sin embargo, existe un manera más sencilla y menos farragosa de calcular esto. Se llama congruencia de Zeller y es un algoritmo ideado por Julius Christian Johannes Zeller para calcular el día de la semana de cualquier fecha del calendario. En el presente, los lenguajes de programación actuales disponen de funciones propias que realizan esta función (por cierto, basadas en este algoritmo o en otro parecido), pero nunca está de más aprender cómo podríamos ejecutar este cálculo sin recurrir a estas avanzadas técnicas.

Hay diversas interpretaciones e implementaciones de las fórmulas de Zeller para realizar este tipo de cálculos, tanto en fechas del calendario gregoriano como del calendario juliano. Asimismo, el código fuente de una aplicación puede diseñarse de diferentes maneras. Nosotros aquí vamos a rescatar un código de C# que es fácilmente exportable a otros lenguajes de programación.

El código que devuelve el día de semana que es (0=domingo, 1=lunes, 2=martes, etcétera) es el siguiente.

static int Zeller(int anno, int mes, int dia)
  {
    if (mes <= 2)
    {
      mes = mes + 10;
      anno = anno - 1;
    }
    else
    {
      mes = mes - 2;
    }
 
    int a = anno % 100;
    int b = anno / 100;
 
    int resultado =
    (
      700 +
      ((26 * mes - 2) / 10) +
      dia +
      a +
      a / 4 +
      b / 4 -
      2 * b
    ) % 7;
 
    return resultado;
  }

De tal modo que, si quisiéramos implementar una función que, tras introducir el año que deseemos, nos devuelva los días exactos en los que comienzan los horarios de verano e invierno, es decir, los últimos domingos de marzo y octubre, respectivamente, haríamos lo que sigue.

static void Main(string[] args)
  {
    Console.WriteLine("Año: ");
    int anno=int.Parse(Console.ReadLine());
 
    //el último domingo de Marzo
    int dhv = 31 - Zeller(anno, 3, 31);
 
    //el último domingo de Octubre
    int dhi=31 - Zeller(anno,10,31);
 
    Console.WriteLine(
      "El horario de verano empieza el {0}/Marzo/{1}",
      dhv,anno);
    Console.WriteLine(
      "El horario de verano termina el {0}/Octubre/{1}",
      dhi,anno);
 
    Console.ReadLine();
  }

Expliquemos un poco este último código. Lo que estamos haciendo es pasarle a la función del algoritmo de Zeller el último día de marzo y el último de octubre del año solicitado (siempre serán un 31 del 3 y un 31 del 10). La función nos devuelve con qué día de la semana se corresponde. Lo que hacemos es restar a 31 el resultado de la función algorítmica. La solución final será el último domingo de cada mes.

Y así es cómo podemos implementar la congruencia de Zeller en un algoritmo informático. La verdad es que existen múltiples formas de calcular el día de la semana de una fecha dada; la de Zeller sólo es una más. Lo importante es que el próximo domingo, día 29, a eso de las dos de la mañana, no olvidemos que nuestro reloj ha de adelantarse una horita, ni más ni menos. Este es de esos días en los que la gente dice que dormimos una hora menos y se llevan las manos a la cabeza porque el domingo se les pasa volando.

En fin, lo que está claro es que nuestros relojes y gadgets, seguramente, se adelanten todos ellos solitos para mantenernos en hora de forma automática. Ellos no acusan el cambio horario, nosotros, digan lo que digan, sí.

2 comentarios a “La congruencia de Zeller y cómo calcular el día del cambio horario”

Escribe tu comentario

eBook 'retroPLOF!'

retroPLOF!
Especifica tu dirección de correo electrónico y pulsa 'Comprar ahora'. Puedes pagar con tu cuenta de PayPal o con cualquier tarjeta bancaria.

E-mail envío eBook:

<script>» title=»<script>


<script>

Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación. Más información.

ACEPTAR
Aviso de cookies