você está aqui: Home  → Arquivo de Mensagens

Gerador de Exceções no Horário de Verão 2008 e Além

Colaboração: Joner Cyrre Worm

Data de Publicação: 21 de setembro de 2008

Graças à sempre subestimada capacidade criativa do legislador brasileiro, ainda não temos um Horário de Verão passível de ser descrito em um par de regras nas configurações Zoneinfo.

O Decreto 6.558/2008 fixou o início e o fim do Horário de Verão para os terceiros domingos de outubro e fevereiro, respectivamente. Mas, acabou por abrir uma exceção quando o fim do H.V. concidir com o Domingo de Carnaval, que, no entender de nossos iluminados congressistas, é um feriado mais sério que o Dia de Eleição, que ficou fora. Acho que muitos concordam com Suas Excelências. Ou é porque agora estão adotando [Software Livre nas Urnas Eletrônicas http://www.tse.gov.br/sadAdmAgencia/noticiaSearch.do?acao=get&id=966324], hehehe.

Assim, após pesquisar um pouco mais sobre a dica do Braulio Junior, foi possível desenvolver um script shell para gerar todas as exceções em um conjunto finito de anos para não rompermos o Sétimo Selo Apocalíptico ao macular a Sagrada Cadência dos Foliões e Bacantes carnavalescos.

Com o uso do script, será possível acrescentar as regras de exceções ao arquivo ZIC para ser gerado de forma semelhante ao descrito na [dica do Marcelo Conti http://www.dicas-l.com.br/dicas-l/20080222.php].

Isto até que as Suas Excelências resolvam obrar mais uma pérola legislativa.

O artigo fonte está em [http://www.worm.sh/] onde pode ser obtido um script funcional desta dica, o embasamento teórico e extras (detalhe: os artigos deste site estão em inglês).

O Cálculo do Domingo de Páscoa

Semelhante à implementação do Braulio Jr, porém optei por implementar com comandos let, o que torna mais explícita a direta implementação do cálculo conforme sua fonte no artigo Computus da Wikipedia.

  Y=$1    # parametro ANO com seculo
  let 'a = Y % 19'
  let 'b = Y / 100'
  let 'c = Y % 100'
  let 'd = b / 4'
  let 'e = b % 4'
  let 'f = (b+8) / 25'
  let 'g = (b - f + 1) / 3'
  let 'h = (19 * a + b - d - g + 15) % 30'
  let 'i = c / 4'
  let 'k = c % 4'
  let 'L = (32 + 2 * e + 2 * i - h - k) % 7'
  let 'm = (a + 11 * h + 22 * L) / 451'
  let 'month = (h + L - 7 * m + 114) / 31'
  let 'day = ((h + L - 7 * m + 114) % 31) + 1'

Ao final, temos o ano ($Y), mês ($month) e o dia ($day) do Domingo de Páscoa.

Cálculo do Domingo de Carnaval

O Domingo de Carnaval ocorre 49 dias antes da Páscoa:

  • 40 dias de Quaresma.
  • 6 domingos durante a quaresma, os Domingos Pascais
  • 3 dias da Quarta de Cinzas (1º dia de Quaresma) até o Domingo de Carnaval

Optei pelo uso do comando date para subtrair os dias da data do Domingo de Páscoa:

  dayc=`date --date="$Y-$month-$day 12:00:00 utc -49 days" +"%d"`
  monthc=`date --date="$Y-$month-$day 12:00:00 utc -49 days" +"%m"`

Assim, a variável $dayc contém o dia do mês referente ao Domingo de Carnaval, e a variável $monthc contém o mês (numérico de 2 algarismos).

Leia mais sobre o comando date.

Geração da Regra de Exceção

Para a exceção, interessa apenas quando o Domingo de Carnaval ocorrer no mês de fevereiro. Além disto, deve ser o terceiro domingo do mês. Resolvi inferir qual intervalo de dias do mês este pode ocorrer:

  • Limite inferior:
  • O 1º domingo ocorre em 1º de fevereiro
  • 3º domingo ocorre dia 15
  • Limite superior:
  • O 1º domingo ocorre em 7 de fevereiro
  • 3º domingo ocorre dia 21

Se o Domingo de Carnaval ocorrer dentro deste intervalo, então haverá coincidência, devendo ser prorrogado o H.V. em mais 7 dias, ou seja: o último domingo de fevereiro.

  if [ $monthc == "02" ]; then                  # Somente Carnaval em fevereiro
   if [ $dayc -gt 14 -a $dayc -lt 22 ]; then    # menor e maior dia para 3o. domingo
  
      # Domingo de Carnaval = fim do H.V
  
      # adia para o proximo domingo
      let 'dayd = dayc +7'
  
      # gera regra Zoneinfo na STDOUT
      echo "Rule  Brazil  $Y  only -    Feb  $dayc  0:00  0  -"
   fi
  fi

A regra segue o formato descrito na manpage do comando zic e pode ser assim resumida:

  Rule    = declara a regra
  Brazil  = nome que será referenciado posteriormente na regra geral: ``Zone``
  $Y      = conterá o ano
  only    = especifica que a exceção vale apenas para o ano $Y
  -       = hifen, vá ler a documentação!
  Feb     = mês de fevereiro
  $dayc   = o dia do mês para fim do H.V.
  0:00    = a mudança ocorrerá a zero hora de domingo,
          meia-noite de sábado para ser mais preciso
  0       = haverá um deslocamento de zero horas em relação ao
          fuso-horário padrão, ou seja: acaba o H.V.
  -       = retira a letra extra do código de timezone,
          que era ``S``, mudando de BRST para BRT

Acesse o artigo sobre Horário de Verão (Daylight Saving Time) no site [http://www.worm.sh/] onde você também encontrará regras prontas até o ano de 2037, quase o suficiente para se aposentarem os coitados que agora ingressam nesta luta inglória.

Joner Cyrre Worm é desenvolvedor Perl, colaborador do CPAN, tradutor voluntário de CAcert, LPI e Cucumis, e sysadmin em um órgão público.

Solução número 1 para substituição do MS Exchange disponibiliza seu software

Fonte: Notícias Linux

Amsterdam, Holland Open Convention - 18 de Setembro de 2008 - Zarafa, a solução número um para substituir o MS Exchange, anunciou que o seu popular Groupware será Open Source.

Com o objetivo de incentivar e patrocinar a criação de uma solução Open Source de Groupware para a substituição do MS Exchange em escala "Enterprise", a Zarafa contribuirá com o core e o código-fonte completo do servidor Zarafa - conhecido pela a flexibilidade e compatibilidade MAPI de 100% - para a comunidade. Isso possibilitará maiores opções de compatibilidade, localização, acessórios e integração com outros sistemas.

Leia mais no site: http://www.noticiaslinux.com.br/nl1221791721.html

Comente: http://www.noticiaslinux.com.br/nl1221791721.html#comentarios



Veja a relação completa dos artigos de Joner Cyrre Worm

 

 

Opinião dos Leitores

Seja o primeiro a comentar este artigo
*Nome:
Email:
Me notifique sobre novos comentários nessa página
Oculte meu email
*Texto:
 
  Para publicar seu comentário, digite o código contido na imagem acima
 


Powered by Scriptsmill Comments Script