En el enlace que puse viene explicado, y también en la wikipedia, pero esa explicación no la entiendo
http://es.wikipedia.org/wiki/Congruencia_de_ZellerLo que calculamos es el último domingo de Marzo y el último domingo de Octubre (las 2 de la madrugada del sábado al domingo ya es el domingo) y si la fecha actual es posterior al último domingo de Marzo, y anterior al último domingo de octubre, entonces es horario de verano (lo almaceno poniendo la variable horariodeverano a true). Se podría afinar más haciendo el cambio a las 2 de la madrugada, pero a mí me vale si lo hace a las 12 de la noche y me simplifica el código.
La hora, la tengo en UTC y si es horario de verano, cuando voy a escribirla muestro la hora +2, pero si no es horario de verano, muestro la hora +1.
if (horariodeverano==true)
{
Serial.print(now.hour()+2, DEC);
}
else
{
Serial.print(now.hour()+1, DEC);
}
Aquí la función calculacambiohora, que llama a la de Zeller:
void calculacambiohora () {
DateTime now = RTC.now();
int anno=now.year();
//el último domingo de Marzo
int dhv = 31 - Zeller(anno, 3, 31);
//el último domingo de Octubre
int dhi=31 - Zeller(anno,10,31);
horariodeverano=false;
if ((( now.month()>3 ) && ( now.month()<10 )) || ( ( now.month()==3 ) && ( now.day()>=dhv)) || ( ( now.month()==10 ) && ( now.day()<dhi)))
{
horariodeverano=true;
}
}
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;
}
Lo probé el otro día, y por la mañana el arduino-reloj mostraba la hora con el cambio correcto
Saludos