Go Down

Topic: Horário de Verão do Brazil - DST BR - Decreto N° 9.242 de 15 de dezembro de 2017 (Read 1 time) previous topic - next topic

rtek1000

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.

https://giovanibettiol.wordpress.com/2009/10/06/algoritmo-para-calcular-o-periodo-do-horario-de-verao/

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.

http://www.profcardy.com/artigos/pascoa.php

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!
Please avoid private messages, your question may be someone's answer in the future!

rtek1000

Mais sobre o horário de verão:

http://nippobrasilia.com.br/news/horario-brasileiro-de-verao-20162017/
Please avoid private messages, your question may be someone's answer in the future!

Arank

Quote
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.

Code: [Select]
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;
}

rtek1000

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

Code: [Select]
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!
Please avoid private messages, your question may be someone's answer in the future!

rtek1000

Olá,

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

Quote
Início: primeiro domingo do mês de novembro,
Fim: terceiro domingo do mês de fevereiro
Code: [Select]
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;
}
Please avoid private messages, your question may be someone's answer in the future!

rtek1000

Olá,

Considerando:
Quote
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

Code: [Select]
// 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

Code: [Select]
// 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]
Please avoid private messages, your question may be someone's answer in the future!

Go Up