Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
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
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
Opinião dos Leitores
22 Set 2008, 08:55
22 Set 2008, 08:52
Recentemente me envolvi com o problema e analisei a equação que calcula o domingo de páscoa, e adaptei-a para calcular também a terça feira de carnaval e a quinta feira do corpus christi, nossos dois outros feriados móveis.
Basta trocar convenientemente o 114 das linhas
let 'month = (h + L - 7 * m + 114) / 31'
let 'day = ((h + L - 7 * m + 114) % 31) + 1'
por 63, para calcular o domingo do carnaval.
para o corpus christi, troca-se por 60 dias mais, 175, e obtém-se uma quinta-feira.












