Manipulação de Datas

Introdução

No mundo da programação, é comum necessitarmos de algum utilitário que efectue cálculos com datas do calendário gregoriano. Os ambientes de programação integrados normalmente possuem tais funções já definidas internamente, bastando ao programador apenas fazer uso das mesmas. A principal questão deste artigo é responder à questão: como podem esses cálculos ser processados? Para solucionar este tipo de problemas, é conveniente conhecer e utilizar algoritmos específicos. Existem várias formas e soluções, no entanto é aconselhável utilizar aquelas que já tenham sido testados como, por exemplo, algoritmos utilizados na área da Observação Astronómica, que possibilitam calcular qualquer data a partir do ano 4712 a.C. Para entender melhor o processo do cálculo de datas, torna-se necessário entender os conceitos de: Dia Juliano, Calendário Juliano, Calendário Gregoriano e Ano Bissexto.

Dia Juliano

O dia Juliano é um valor sequencial positivo inteiro que representa uma contagem sucessiva de dias a partir do ano 4712 a.C., ou seja, do ano -4712. A data 01/01/2000 seria representada como dia Juliano com o valor 2.451.545. Assim sendo, é possível calcular a diferença entre datas distantes. Por exemplo, quantos dias existem entre as datas 01/01/2000 e 26/04/1965? Para obter o número de dias entre as datas, é necessário converter cada uma das datas para os respectivos valores sequenciais para então efectuar o cálculo da diferença de dias entre as datas desejadas. Desta forma, a data 26/04/1965 (2.438.877) subtraída da data 01/01/2000 (2.451.545) resulta no valor 12.688 dias.

Calendário Juliano

O calendário Juliano foi instituído no ano 46 a.C. (época do imperador romano Júlio César) e utilizado até 04/10/1582. Nesta ocasião foram considerados três anos de 365 dias e um de 366, a cada quatriénio (ano bissexto). Nesse período, o mês de Fevereiro possuía 29 dias, tendo 30 dias apenas nos anos bissextos. Em homenagem ao imperador foi dado o nome de Julho ao sétimo mês do Calendário Juliano, o qual possui até hoje um ciclo de 31 dias. A partir do ano 8 a.C., tempo do imperador César Augusto, houve a mudança do nome do oitavo mês para Agosto (em sua homenagem), e como o mês de Julho possuía 31 dias, foi então atribuído mais um dia ao mês de Agosto, passando este a ter um ciclo de 31 dias, tal como o mês de Julho e, para que não houvesse diferença entre as homenagens. Este dia a mais foi retirado do mês de Fevereiro, que passou a ter um ciclo de 28 ou 29 dias nos anos bissextos. Desde então, ficaram instituídas as regras para os meses com 31 dias (Janeiro, Março, Maio, Julho, Agosto, Outubro e Dezembro), com 30 dias (Abril, Junho, Setembro e Novembro) e com 28 ou 29 dias (Fevereiro).

Calendário Gregoriano

O calendário Gregoriano foi instituído na reforma papal do pontificado do Papa Gregório XIII. Um facto curioso é que o calendário Gregoriano foi iniciado em 05/10/1582, tendo uma diferença de 10 (dez) dias em relação ao término do calendário Juliano. Observe como ficou o calendário do mês de Outubro de 1582, quando ocorreu a junção dos calendários Juliano e Gregoriano.

Outubro 1582
DomSegTerQuaQuiSex
123415
171819202122
242526272829

A supressão de dez dias ocorreu devido a um erro no ciclo do número de dias de um ano, existente no calendário Juliano, que prevê um ano de 365,25 dias, quando este ciclo é de 364,24219271 dias, sendo reduzido a uma razão de 0,005369 segundo por ano.

Ano Bissexto

Os cálculos para determinar anos bissextos nos calendários Juliano e Gregoriano são diferentes. No calendário Juliano é ano bissexto todo ano divisível por 4 (quatro), porém no calendário Gregoriano, devido às correcções e para maior precisão astronómica, considera-se bissexto o ano divisível por 4 (quatro), excepto os anos terminados em 00 que para serem bissextos necessitam ser divisíveis por 400 (quatrocentos). O ajuste nos anos terminados com 00 ocorre a cada 400 (anos), devido ao ciclo de um ano possuir 364,24219271 dias, sendo reduzido a uma razão de 0,005369 segundo por ano, ciclo denominado de ano trópico, quando ocorre o equinócio (quando o Sol está exactamente sobre a linha do equador no início da primavera ou no início do mês de Outubro; nesta ocasião o dia e a noite têm a mesma duração temporal).

Algoritmos

A partir da exposição dos conceitos anteriores é apresentado os algoritmos utilizados para conversão de data em dia Juliano, conversão de dia Juliano em data e verificação de ano bissexto. Conversão de Data em Dia Juliano Para converter uma data do calendário Juliano ou calendário Gregoriano em dia Juliano deve-se fazer uso de um algoritmo específico que transforma uma data num número sequencial, como o demonstrado:

Leia DIA, MÊS, ANO
Se (MÊS < 3) Então
  ANO <- ANO - 1
  MÊS <- MÊS + 12
Fim_se
Se (DATA >= 15/10/1582) Então {Calendário Gregoriano}
  A <- Inteiro(ANO / 100)
  B <- Inteiro(A / 4)
  C <- 2 - A + B
Senão {Calendário Juliano}
  C <- 0
Fim_se
D <- Inteiro(365,25 * (ANO + 4.716))
E <- Inteiro(30,6001 * (MÊS + 1))
F <- D + E + DIA + 0,5 + C - 1.524,5
JULIANO <- Inteiro(F)
Escreva JULIANO

O algoritmo de conversão verifica primeiro se o MÊS é menor que dois. Sendo a condição verdadeira, é feito um ajuste nos valores de ANO e MÊS. Em seguida, é verificado se a data fornecida pertence ao calendário Gregoriano (datas a partir de 15/10/1582) ou calendário Juliano (datas anteriores a 04/10/1852). Se a data pertencer à parte do calendário Gregoriano, a variável C é ajustada a partir das variáveis A e B; caso contrário, à variável C é atribuído o valor de zero. Após a verificação da condição e estando a variável C ajustada, são realizados cálculos para determinar o número de dias a partir de 4712 a.C.

Conversão de Dia Juliano em Data

Para converter um dia Juliano em data é necessário também seguir um algoritmo específico de conversão, que tem em consideração o facto de um ano ser ou não bissexto.

Leia JULIANO
A <- JULIANO
Se (A > 2.299.160) Então
  B <- Inteiro((A - 1.867.216,25) / 36.524,25)
  C <- A + 1 + B - Inteiro(B / 4)
Senão
  C <- A
Fim_se
D <- C + 1.524
E <- Inteiro((D - 122,1) / 365,25)
F <- Inteiro(E * 365,25)
G <- Inteiro((D - F) / 30,6001)
H <- D - F - Inteiro(G * 30,6001)
Se (G < 14) Então
  I <- G - 1
Senão
  I <- G - 13
Fim_se  
Se (I > 2) Então
  J <- E - 4.716
Senão
  J <- E - 4.715
Fim_se
Se (J > 0) Então
  K <- J
Senão
  K <- Módulo(J + 1) {Módulo = valor positivo}
Fim_se
DIA <- H
MÊS <- I
ANO <- K
Escreva DIA, MÊS, ANO

O algoritmo em questão atribui a variável A o valor de dias Juliano, e em seguida verifica se o valor de dias Juliano é maior que 2299160 (no calendário Gregoriano, equivale a 04/10/1582). Se esta condição for verdadeira, são executados os devidos ajustes de tempo para o valor da variável C; caso contrário (sendo a data pertencente ao calendário Juliano), a variável C é implicada directamente pelo valor da variável A (sem os ajustes). Seguidamente, é executada uma série de cálculos para extrair os valores do DIA, MÊS e ANO do dia Juliano fornecido. Verificação de Ano Bissexto Para verificar se o ano de uma data é ou não bissexto deve-se fazer uso do algoritmo apresentado em seguida.

Leia ANO
Se (ANO mod 4 <> 0) Então
  ANO NÃO É BISSEXTO
  Se (ANO mod 100 = 0) Então
    Se (ANO mod 400 = 0) Então
      Escreva "ANO É BISSEXTO"
    Senão
      Escreva "ANO NÃO É BISSEXTO"
    Fim_se
  Senão
    Escreva "ANO É BISSEXTO"
  Fim_se
Fim_se

Com o algoritmo de ano bissexto é possível verificar primeiro se uma data é divisível por quatro. Pode ser divisível quando o resto da divisão do ano por quatro for diferente de zero (considerando como quociente da divisão um resultado sempre inteiro). Neste caso, existe a possibilidade de o ano ser bissexto. Dentro dessa possibilidade, é utilizada uma segunda condição (para detectar os anos que terminam com 00), em que se verifica se o ano é divisível por cem. Se o ano for divisível por cem, é possível ainda ser bissexto. Para verificar esta possibilidade utiliza-se a terceira condição quando o ano é dividido por 400.

Referências Bibliográficas

MANZANO, J. A. N. G.; YAMATUMI, W. Y. Free Pascal: Programação de Computadores. São Paulo, Brasil: Editora Érica, 2007. 390 p., ISBN 978-85-365-0136-9.

Publicado na edição 15 (PDF) da Revista PROGRAMAR.