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 | Adicionar aos favoritos

Comentar:
De
 
Nome

Url

Email

Guardar Dados?

Ainda não tem um Blog no SAPO? Crie já um. É grátis.

Comentário

Máximo de 4300 caracteres



O dono deste Blog optou por gravar os IPs de quem comenta os seus posts.

Cognosco ergo sum

Conheço logo sou

no Cognosco
 
Cogitações recentes
Olá Ribeiro. Eis um link atualizado para a folha d...
Seria possível fornecer um link atualizado para o ...
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...
Artigos mais cogitados
282 comentários
74 comentários
66 comentários
62 comentários
44 comentários
Artigos

Setembro 2018

Novembro 2017

Outubro 2017

Agosto 2017

Julho 2017

Junho 2017

Maio 2017

Abril 2017

Março 2017

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

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