Horário de Verão do Brazil - DST BR - Decreto N° 9.242 de 15 de dezembro de 2017

Olá pessoal,

Eu fiz uma automação de relógio de torre de igreja, e precisava manter a hora mais sincronizada, então resolvi fazer uso de NTP.

Porém, eu não sei se tem algum servidor NTP que já fornece a hora corrigida de acordo com a região, que esteja sob o horário de verão.

Parece que já existe alguma coisa sobre horário de verão para países da Europa, mas as regras adotadas no Brasil, são bem interessantes, se tiver um pouco de paciência, de uma conferida.

Encontrei uma alternativa para algum calculo, mas apesar de mais prático manualmente, se mostrou mais complexo no código, e passou a consumir mais recurso, pelos testes que fiz.

Consegui encontrar a placa ESP8266, que é de baixo custo e consegue operar com NTP e sem o Arduino, mas pode ser programada pela IDE do Arduíno.

Então, procurando na internet, encontrei alguns sites que me ajudaram a montar essas rotinas anexadas. Não deu para postar diretamente devido ao tamanho.

Notem que a biblioteca DateTime do Arduino parece não funcionar mais nas novas IDE, sendo substituídas por outras bibliotecas, como a TimeLib.

O código ainda está com diversos 'testes' comentados, que eu usei para depurar, então pode ser possível enxugar ainda mais, quem sabe se sobrar um tempo, faço uma biblioteca para facilitar o uso.

Se encontrar algum erro, que realmente seja um erro, por favor informe, se possível vamos acertando.

Com estas rotinas basta entrar com o ano, que vai poder obter o dia e mês que poderá iniciar o horário de verão e o término, que acontecerá no ano seguinte.

O consumo de recursos é de cerca de 10% de Flash e RAM para um Nano 328.

O código está disponível para uso não comercial.

Obrigado e boa sorte!

Arduino_Summer_Time.ino (17.5 KB)

Mais sobre o horário de verão:

Quando começa e termina o Horário Verão?

Desde 2008, foi fixada a data de início e término do Horário de Verão no Brasil, que deve começar à zero hora do terceiro domingo de outubro e terminar à zero hora do terceiro domingo de fevereiro do ano seguinte (se coincidir com o domingo de carnaval, o horário é prorrogado por mais uma semana).

O horário de verão brasileiro é bem fácil de calcular na verdade.

int timeZone() {
  int previousSunday = day() - weekday();
  if (month() < 2 || month() > 10) return -2;
  else if (month() == 2 && previousSunday < 14) return -2;
  else if (month() == 10 && previousSunday >= 14) return -2;
  else return -3;
}

Arank:
O horário de verão brasileiro é bem fácil de calcular na verdade.

int timeZone() {

int previousSunday = day() - weekday();
 if (month() < 2 || month() > 10) return -2;
 else if (month() == 2 && previousSunday < 14) return -2;
 else if (month() == 10 && previousSunday >= 14) return -2;
 else return -3;
}

Olá gostaria de salientar que houve mudança na regra do horário de verão brasileiro:

Início: primeiro domingo do mês de novembro,
Fim: terceiro domingo do mês de fevereiro (do ano seguinte, óbvio)

Sendo que durante o horário de verão, ele está com uma hora adiantada.

Decreto N° 9.242 de 15 de dezembro de 2017:
http://pcdsh01.on.br/DecHV9242_20171215.pdf

Desta forma, será necessário atualizar o código, que está obsoleto, não utilizem!

Olá,

Este código precisa ser verificado, agradeço se alguém puder fazer o favor de avaliar e informar, obrigado:

Início: primeiro domingo do mês de novembro,
Fim: terceiro domingo do mês de fevereiro

int timeZone() {
  int previousSunday = day() - weekday();
  if (month() < 2 || month() > 11) return -2;
  else if (month() == 2 && previousSunday < 14) return -2;
  else if (month() == 11 && previousSunday > 0) return -2;
  else return -3;
}

Olá,

Considerando:

Domingo = 0
Segunda-feira = 1
Terça-feira = 2
Quarta-feira= 3
Quinta-feira = 4
Sexta-feira = 5
Sábado = 6

Horário de Verão 2018/2019: 04/11/2018 - 17/02/2019

// 03/11/2018 - sábado

int previousSunday = day() - weekday(); // previousSunday=-3 = day=3 - weekday=6
if (month() < 2 || month() > 11) return -2; // month=11 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=11 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=11 [true] && previousSunday=-3 [false]
else return -3; // [true]

// 04/11/2018 - domingo

int previousSunday = day() - weekday(); // previousSunday=4 = day=4 - weekday=0
if (month() < 2 || month() > 11) return -2; // month=11 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=11 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=11 [true] && previousSunday=4 [true]
else return -3; // [false]

// 16/02/2019 - sábado

int previousSunday = day() - weekday(); // previousSunday=10 = day=16 - weekday=6
if (month() < 2 || month() > 11) return -2; // month=2 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=2 [true] && previousSunday=10 [true]
else if (month() == 11 && previousSunday > 0) return -2; // month=2 [false]
else return -3; // [false]

// 17/02/2019 - domingo

int previousSunday = day() - weekday(); // previousSunday=17 = day=17 - weekday=0
if (month() < 2 || month() > 11) return -2; // month=2 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=2 [true] && previousSunday=17 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=2 [false]
else return -3; // [true]

Horário de Verão 2019/2020: 03/11/2019 - 16/02/2020

// 02/11/2019 - sábado

int previousSunday = day() - weekday(); // previousSunday=-4 = day=2 - weekday=6
if (month() < 2 || month() > 11) return -2; // month=11 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=11 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=11 [true] && previousSunday=-4 [false]
else return -3; // [true]

// 03/11/2019 - domingo

int previousSunday = day() - weekday(); // previousSunday=3 = day=3 - weekday=0
if (month() < 2 || month() > 11) return -2; // month=11 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=11 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=11 [true] && previousSunday=3 [true]
else return -3; // [false]

// 15/02/2020 - sábado

int previousSunday = day() - weekday(); // previousSunday=9 = day=15 - weekday=6
if (month() < 2 || month() > 11) return -2; // month=2 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=2 [true] && previousSunday=9 [true]
else if (month() == 11 && previousSunday > 0) return -2; // month=2 [false]
else return -3; // [false]

// 16/02/2020 - domingo

int previousSunday = day() - weekday(); // previousSunday=16 = day=16 - weekday=0
if (month() < 2 || month() > 11) return -2; // month=2 [false]
else if (month() == 2 && previousSunday < 14) return -2; // month=2 [true] && previousSunday=16 [false]
else if (month() == 11 && previousSunday > 0) return -2; // month=2 [false]
else return -3; // [true]