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
- Currently 3.07/5
- 1
- 2
- 3
- 4
- 5
Avaliação:
3.1 /5
(103 votos)
Opinião dos Leitores
Marcelo
22 Set 2008, 08:55
Em tempo, no ubuntu (e provalvemente também em outros debians) há o comando ncal -e <ano>, que retorna diretamente o domingo de páscoa.
Marcelo
22 Set 2008, 08:52
Saudações,
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.