Portada arrow Algoritmos arrow Ya estamos otra vez con el dichoso cambio de hora
Ya estamos otra vez con el dichoso cambio de hora
sábado, 27 de octubre de 2007

Pues eso... que esta noche (28/10/2007) nos toca otra vez el cachondeo del cambio de hora, al menos en la Unión Europea.

A eso de las 3 de las madrugada tenemos que devolver la luz solar que tomamos "prestada" en marzo. Desde hace años está legislado y regulado que el último domingo de marzo adelantamos una hora los relojes, tomando prestada una hora de sol a la mañana y colocándola por la tarde (a las 2 de la mañana se ponen las 3; en la España peninsular, Baleares, Ceuta y Melilla pasamos de UTC+1 a UTC+2 y en Canarias se pasa de UTC a UTC+1), y el último domingo de octubre la devolvemos a la mañana (como ahora, que a las 3 de la mañana tenemos que volver a poner las 2, y pasamos de UTC+2 a UTC+1, y en Canarias de UTC+1 a UTC).

Dicen por ahí que es para ahorrar energía... que así en los meses que van de marzo a octubre podemos disfrutar de una hora más de sol por la tarde.... Bueno vale.... pero lo que no entiendo es por qué no nos quedamos con el horario de verano todo el año. En fin... todo sea por el bien social y la prosperidad de la humanidad :-)

Y tú ¿Qué opinas?

Bueno... pero me he puesto a escribir esto no para expresar la amargura que le produce a mi deteriorado cuerpo estos tejemanejes sino por otra cuestión: la entrada del horario de verano está establecida para el último domingo de marzo, y el fin del horario de verano para el último domingo de octubre... Hemos visto, por ejemplo, que los sistemas operativos nos avisan del cambio de hora y ellos solitos ajustan el reloj del ordenador.... pero... ¿Podemos nosotros saber algorítmicamente cuándo entra y sale el horario de verano cada año? ¡¡¡ Pues claro que sí !!!

 

Para ello podemos revisitar un algoritmo del que ya hablamos hace tiempo, la congruencia de Zeller. Este algoritmo de apariencia casi "mágica" nos dice qué dia de la semana es una determinada fecha del calendario Gregoriano. Le pasamos un día, mes y año, y nos devuelve un entero de 0 a 6. El 0 representa al domingo, el 1 al lunes... y el 6 al sábado.

Si contamos con un método que calcule la congruencia de Zeller (que sí lo tenemos) y queremos saber cual fué el último domingo de marzo de 2007 o de cualquier otro año, podemos utilizar ésta estrategia: le pasamos al algoritmo la fecha del último día de marzo, que siempre es el 31.. y el algoritmo nos devolverá qué día de la semana fué. Si restamos al 31 el resultado del algoritmo, nos dirá qué día cayó el último domingo... Hagamos la prueba.... Si le pasamos 31/3/2007, el algoritmo devuelve 6 (sábado)... Ahora hacemos 31-6 = 25 y ¡TACHAN! El 25 de Marzo de 2007 fue el último domingo de Marzo. ¿Podremos repetir la hazaña y averiguar cuál es el último domingo de Octubre para saber cuándo termina el horario de verano? ¡ Pues claro que sí ! Si le pasamos la congruencia de Zeller al último día de octubre de éste año, es decir, el 31/10/2007 nos devuelve un 3 -miércoles- Haciendo la operación 31-3 = 28 sabemos que el último domingo de Octubre es ¡¡¡ EL 28 !!! dicho de otro modo ¡¡¡¡ HOOOOY !!!! ¡¡¡ FANTÁAAASTICO !!! MWAHAHAHAHAHAHAHAHAHAHA

En fin... no olvideis retrasar los relojes una horita para disfrutar un poco más del sueño -que es lo que necesito yo ahora-, y si os toca viajar en un transporte público esta noche durante el cambio de hora ¡mucho ánimo!

Ah, si... casi se me olvida, una mini-demo de cómo hacer esto en C#:

 

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;
}
 
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();
}

Para saber más:

-El cambio de hora, ¿ahorra energía? External link (Consumer de Eroski)
-Timeanddate.com informa de la hora en muchas ciudades de España, por ejemplo Madrid External link y Santa Cruz de Tenerife External link

(*): Se llama UTC (Tiempo Universal Coordinado) a un estándar de huso horario External link adoptado internacionalmente y que substituye a la antigua "hora de Greenwich External link". La hora expresada en UTC External link es independiente de los ahorros de energía de cada país y sirve de referencia para marcar las horas de los distintos paises.

En la España peninsular, Baleares, Ceuta y Melilla tenemos en invierno una hora más con respecto al UTC, por eso se dice que utilizamos UTC+1 en invierno y UTC+2 en verano. A este horario también se le puede llamar CET External link (hora central europea - Central European Time) que es un alias de UTC+1. Cuando se aplica el horario de ahorro de energía se puede decir que la hora es UTC+2 o CEST (Central European Summer Time). En canarias se utiliza UTC durante el invierno, pasando a UTC+1 durante el verano. A ese horario también se le puede llamar WET External link (hora de Europa occidental - West European Time) o WEST en verano (Western European Summer Time).

 
Artículo siguiente→

Categorías

Suscríbete

RSS feed Sindicación RSS

(¿Qué es la sindicación RSS?)


Suscribir por e-mail

¿Dónde estoy?

Estás en La tecla de ESCAPE, un sitio web personal en el que nos gusta hablar de algoritmos, informática, tecnología, ciencia, ingeniería, internet... y cualquier tontería que se nos ocurra. El punto de vista de nuestros artículos técnicos suele ser muy básico, así que a menudo adoptamos grandes simplificaciones. (Más...-Términos de uso)