Últimas atualizações
Novo endereço do Cognosco: http://www.cognoscomm.com
Diário das pequenas descobertas da vida.
Domingo, 15 de Janeiro de 2006
Problema calendarii
Por diversas vezes acontece ser necessário (ou desejável) saber-se qual o dia da semana em que calha (ou calhou) determinado dia do mês de um qualquer ano, por exemplo para determinar em que dia da semana se nasceu ou em que dia da semana determinado feriado ocorrerá. Ou em que exacto dia da semana foi o 25 de Abril de 1976 (5ª), em que dia da semana nasceu uma determinada personalidade sabendo a sua data de nascimento (ou morte). Em vários artigos são referidas datas específicas em que ocorreram determinados acontecimentos. Por exemplo, Fernando Pessoa nasceu em 13 de Junho de 1888. Em que dia da semana foi? (quarta feira)

É uma questão que se responde recorrendo à memória dos mais velhos (quando os acontecimentos foram por eles testemunhadoos) ou procurando algum calendário perdido em alguma gaveta (procura amiudadamente infrutífera pois dificilmente se tem calendários para anos que não o anterior).

Mas há alguma forma de calcular o dia da semana sem andar a procurar por calendários?
Já no artigo Celeres dies se falou de uma forma de determinar o dia da semana de uma determinada data, tendo como referência um dia de que se conheça a posição na semana. Mas o facto de requerer o conhecimento de uma data específica e da sua localização na semana impede (pela morosidade dos cálculos ou desconhecimento dos dias da semana) a sua aplicação a datas afastadas dos anos mais próximos.

Mas, usando uma regra chamada Regra de Zeller.
Este regra foi criada pelo reverendo alemão Julius Christian Johannes Zeller, e com ela é possível calcular com exactidão o dia da semana de qualquer data, bastando saber o dia, o mês e o ano (no calendário Gregoriano que usamos).
Zeller nasceu em 1822 e morreu em 1899.
Foi um estudioso de Matemática, Geografia e de Teologia.
Em 1883 desenvolveu a fómula, uma para o calendário Juliano outra para o calendário gregoriano.

Para o nosso calendário, a fórmula é a seguinte:
f = d+INT((13*m - 1)/5)+a+INT(a/4)+INT(s/4)-2*s

Nesta fórmula, adaptada ao Português em termos dos nomes das variáveis usadas,
d é o dia do mês dia; m é o número do mês; s é os primeiros dois dígitos do ano (o século) e a é os últimos dois dígitos do ano.


Para o cálculo deste valor é necessário também conhecer a fórmula matemática que aqui designei por INT: é simplesmente a parte inteira do número.
É diferente do arredondamento!
e.g. int(1,45) = 1; int (4,51) = 4; int (5/2) = int (2,5) = 2

Após o cálculo de f, divide-se de forma inteira esse valor por 7 e o resto da divisão indica o dia da semana em que a data se situa.
(Em algumas aplicações, o cálculo do resto quando o valor é negativo poderá dar um resto errado. Caso o valor seja negativo deve-se então somar 7.)

Soma-se ao resultado final 1.
Se esse valor final for 1 o dia da semana é domingo, se for 2 é segunda-feira,... ,
se for 6 é sexta-feira e se for 7 é sábado.

É necessário ter alguns cuidados como a questão de considerar o ano anterior quando o cálculo envolve os meses de Janeiro ou Fevereiro ou a do facto de não existir o ano 0 no calendário gregoriano.
Passa-se do ano -1 (1 AC) directamente para o ano 1 (1 DC).
É por esta razão (a falta do ano 0) que a passagem do milénio ocorreu de 2000 para 2001 e não de 1999 para 2000, apesar de as razões comerciais levarem à sociedade com um todo a comemorar duas vezes a passagem do milénio!

Verifique-se a aplicação da fórmula a uma data específica.
O dia 31 de Dezembro de 2005 foi num sábado. Use-se a fórmula neste caso para a verificar. Para evitar a questão do dia extra que Fevereiro tem nos dias bissextos, para usar esta fórmula o ano começa em Março (como faziam os Romanos).
Assim Março é 1, Abril é 2, Maio é 3,... , Novembro é 9 e Dezembro é 10.
Janeiro é o mês 11 do ano anterior e Fevereiro é o mês 12 do ano anterior.

Então a data de que procuramos o dia da semana terá, para valores:
~ d = 31;
~ m = 10;
~ s = 20;
~ a = 05;

f = 31 + int((13*10 - 1)/5) + 5 + int(5/4) + int(20/4) - 2*20 =
= 31 + int ((130 - 1)/5) + 5 + int(1,25) + int(5) - 40 =
= 31 + int(129/5) + 5 + 1 + 5 - 40 =
= 31 + int(25,8) + 5 + 1 + 5 - 40 =
= 31 + 25 + 5 + 1 + 5 - 40 =
= 27

Como 27 = 7*3 + 6, a divisão de 27 por 7 dá resto 6.
Como é um número positivo soma-se 1. 6 + 1 = 7
O dia da semana é o sétimo. É sábado.

• Outro exemplo, o dia de criação do Cognosco (18/02/2005)
~ d = 18;
~ m = 12; (o ano começa em Março e Fevereiro é 12.)
~ s = 20;
~ a = 04; (como o mês é Fevereiro, para a fórmula é o ano anterior)

f = 18 + int((13*12 - 1)/5) + 4 + int(4/4) + int(20/4) - 2*20 =
= 18 + int ((156 - 1)/5) + 4 + int(1) + int(5) - 40 =
= 18 + int(155/5) + 4 + 1 + 5 - 40 =
= 18 + int(31) + 4 + 1 + 5 - 40 =
= 18 + 31 + 4 + 1 + 5 - 40 =
= 19

Como 19 = 7*2 + 5, a divisão de 32 por 7 dá resto 5.
Como é um número positivo soma-se 1. 5 + 1 = 6
O dia da semana é o sexto.
O Cognosco nasceu numa sexta-feira.

• Outro exemplo, o imperador Cláudio nasceu a 1 de Agosto de 10 AC.

~ d = 10;
~ m = 6;
~ s = 00;
~ a = -9; (como o ano é AC, tem de se somar 1. -10 + 1 = -9)

f = 10 + int((13*6 - 1)/5) + -9 + int(-9/4) + int(0/4) - 2*0 =
= 10 + int ((78 - 1)/5) + 4 + int(1) + int(5) - 40 =
= 10 + int(77/5) + 4 + 1 + 5 - 40 =
= 10 + int() + 4 + 1 + 5 - 40 =
= 10 + 31 + 4 + 1 + 5 - 40 =
= 10

Como 10 = 7*1 + 3, a divisão de 10 por 7 dá resto 1.
Como é um número positivo soma-se 1. 1 + 1 = 2
O dia da semana é o segundo.
Cláudio nasceu numa segunda-feira.

Claro que a fórmula necessita de um pouco de familiarização para ser usada facilmente.
Mas a sua utilidade é maior na programação de computadores (ou de outros aparelhos programáveis).

É fácil, usando estas regras, criar programas informáticos para, introduzindo uma data, obter-se o dia da semana. Há vários programas para diversas linguagens.
A que mais falta me fez sempre foi ter a Regra de Zeller numa folha de cálculo.
Mas com um pouco de empenho finalmente transcrevi a fórmula para ser usada neste caso.

O dia está na célula A1, o mês está na célula B1 e o ano na célula C1.

=RESTO((A1+TRUNCAR((13*(SE(B1-2>0;B1-2;B1+10))-1)/5)+(SE((SE(B1-2>0;B1-2;B1+10))>10;C1-(TRUNCAR(C1/100))*100-1;C1-(TRUNCAR(C1/100))*100))+TRUNCAR((SE((SE(B1-2>0;B1-2;B1+10))>10;C1-(TRUNCAR(C1/100))*100-1;C1-(TRUNCAR(C1/100))*100))/4)+TRUNCAR((TRUNCAR(C1/100))/4)-2*(TRUNCAR(C1/100)));7)+1

No título «O problema calendário», parte do título da obra de 1883 de Zeller «Problema duplex calendarii fundamentale» (O problema fundamental dos dois calendários)


Publicado por Mauro Maia às 15:39
Atalho para o Artigo | Cogitar | Adicionar aos favoritos

13 comentários:
De ines a 15 de Janeiro de 2006 às 22:14
eu acho que te "passaste" simplesmente...


De Mauro a 16 de Janeiro de 2006 às 00:04
Obrigado «ines» pelo inigmático comentário ao artigo. Não sei se me terei passado positivamente para o outro lado do espelho ou negativamente para o outro lado da sanidade mental. Faço votos que tenha de facto apenas descoberto o reverso do espelho. Obrigado por vires e mantém o espírito crítico. Só através dele se pode crescer.


De Elsita a 16 de Janeiro de 2006 às 15:25
POis é Mauro, já me estava a ver fazer umas contitas, para saber certas e determinadas datas, mas acontece que tenho um programazito que me enviaram que é só colocar os dados e dá-me os dias da semanita com precisão...no passado e no futuro!MAs assim fiquei por dentro...De facto tudo tem uma explicação plausível ou não, e tu não deixas nada por mãos alheias, toca a descodificá-las e descobri-las, partilhando-as connosco. Boa semanita


De Mauro a 16 de Janeiro de 2006 às 15:37
Ainda bem que apreciaste, «Elsita». Eu achei curiosa a questão (já me tinha ocorrido a necessidade de determinar o dia da semana, em particular nas folhas cálculo. As estatísticas do COgnosco, por exemplo, são feitas numa folha de cálculo e só depois são colocadas no blog). E o que eu acho interessante ou curioso coloco no Cognosco, para que os seus leitores possam ajuizar se o acharão também relevante. A Regra de Zeller é curiosa e em muitos casos prática. Zeller criou-a para o calendário gregoriano mas também para o juliano e outra fórmula para determinar o dia da semana em que calha a Páscoa em qualquer ano. A fórmula para folhas de cálculo é, para as minhas necessidades, a mais útil. Mas aqui tens a forma como o teu programa funciona, «Elsita». Obrigado pela visita e pelo comentário.


De Maria Papoila a 16 de Janeiro de 2006 às 18:44
Interessante como sempre. Não tenho o tal programa, não sei fazer bem estas contas mas percebi que a regra de Zeller foi muito bem explicada e demonstrada. Beijo


De Mauro a 16 de Janeiro de 2006 às 18:51
Um programa em si eu também não tenho, Maria Papoila. Consegui fazer (e coloquei no artigo) a forma de usar a Regra de Zeller numa folha de cálculo. Ficou um artigo muito despido, sem imagens e sem animações. Ainda procurei um pouco por imagens adequadas para o ilustrar mas nada encontrei nem nada significativo me ocorreu. Por entre a procura de imagens adequadas e a incerteza de quais se adequariam ao artigo, ficou este como veio ao mundo: despido de imagens ;).


De PN a 16 de Janeiro de 2006 às 19:45
Desculpa Mauro, mas o meu cérebro parece dar um nó no que toca a fórmulas matematicas. Mas vou aproveitar a fórmula para o Excel. No entanto há alguns sites que fornecem esses dados rapidamente. Este é um deles http://www.divertudo.com.br/emquedia.htm


De maresia a 16 de Janeiro de 2006 às 20:33
Cheguei ao fim do texto para chegar a duas conclusões, queria esquecer para sempre que dia é hoje e não saber nunca em que dia nasci. Por razões diferentes.


De Mauro a 17 de Janeiro de 2006 às 00:14
Obrigado, PxN, pela informação sobre uma fonte de programas que usam a Regra de Zeller para o cálculo do dia da semana. É um óptimo contributo, obrigado. E, «maresia», obviamente respeitarei (sem compreender) as razões dessa vontade de ignorar os dias que referes. Espero que o Cognosco sirva para trazer o sol a nascer nas costas do teu mar.


De . a 17 de Janeiro de 2006 às 12:03
Só uma questão: a fórmula tem em consideração o que se passou em Outubro de 1582, aquando da transição do sistema juliano para o gregoriano?


Comentar artigo

Cognosco ergo sum

Conheço logo sou

Estatísticas

Nº de dias:
Artigos: 336
Comentários: 2358
Comentários/artigo: 7,02

Visitas:
(desde 26 de Abril de 2005)
no Cognosco
 
Cogitações recentes
Obrigado, João, pela contribuição. Não está no art...
Estive lendo sua cogitação à respeito do cálculo d...
Obrigado, Aleff, pelo apreço pelo artigo. Exatamen...
achei muito interessante essa sua forma de ver a l...
Obrigado, Desejo um bom 2014 também.
Artigos mais cogitados
282 comentários
74 comentários
66 comentários
62 comentários
44 comentários
Artigos

Fevereiro 2017

Janeiro 2017

Dezembro 2016

Novembro 2016

Outubro 2016

Julho 2016

Março 2015

Dezembro 2014

Outubro 2013

Maio 2013

Fevereiro 2013

Outubro 2012

Setembro 2012

Agosto 2012

Junho 2012

Janeiro 2012

Setembro 2011

Abril 2011

Fevereiro 2011

Dezembro 2010

Maio 2010

Janeiro 2010

Agosto 2009

Abril 2009

Fevereiro 2009

Janeiro 2009

Novembro 2008

Outubro 2008

Agosto 2008

Julho 2008

Junho 2008

Abril 2008

Fevereiro 2008

Janeiro 2008

Novembro 2007

Outubro 2007

Agosto 2007

Julho 2007

Junho 2007

Maio 2007

Abril 2007

Março 2007

Fevereiro 2007

Janeiro 2007

Dezembro 2006

Novembro 2006

Outubro 2006

Setembro 2006

Agosto 2006

Julho 2006

Junho 2006

Maio 2006

Abril 2006

Março 2006

Fevereiro 2006

Janeiro 2006

Dezembro 2005

Novembro 2005

Outubro 2005

Setembro 2005

Julho 2005

Junho 2005

Maio 2005

Abril 2005

Março 2005

Fevereiro 2005