Cálculo da Páscoa

O cálculo da data da Páscoa, também conhecido como Computus em latim, é fundamental no calendário cristão desde os primórdios da cristandade, tornando-se definido na Idade Média.

Tábua medieval da Escandinávia, em escrita rúnica, para cálculo da data da Páscoa
Distribuição das datas da Páscoa para um período completo de 5.700.000 anos.

A Páscoa é celebrada no primeiro domingo após a primeira lua cheia que ocorre depois do equinócio da Primavera (no hemisfério norte, outono no hemisfério sul), ou seja, é equivalente à antiga regra de que seria o primeiro Domingo após o 14º dia do mês lunar de Nissan. O dia de domingo pode variar desde 22 de Março até 25 de Abril, dependendo da disposição dos dias e dos meses nas semanas. Os dias extremos deste intervalo correspondem muito raramente a domingos de Páscoa. A última vez que ocorreu a 22 de Março foi em 1818 e a próxima será em 2285. Menos raras são as Páscoas a 23 de Março (anos 1913, 2008 e 2160) e 25 de Abril (anos 1943, 2038 e 2190).[1]

Cálculo da data da Páscoa recorrendo a tabela simples

Obtenha o número dourado somando 1 ao resto da divisão inteira do ano em questão por 19.

Ao número final chamaremos de "X". Esse número é o "número dourado" que corresponde a uma data específica dada na tabela abaixo. A Páscoa será celebrada ao domingo seguinte à data encontrada na tabela. Caso a data já seja um domingo, a Páscoa é o domingo da semana seguinte.

Exemplo:

2020/19 é igual a 106, com resto 6;

6+1 = 7 (Número dourado)

Consultando na tabela, chega-se a 8 de abril, depois veja qual o domingo seguinte. A Páscoa em 2020 será dia 12 de abril, já que dia 8 é quarta-feira.

Ano X Data
1995 2014 1 14 de Abril
1996 2015 2 3 de Abril
1997 2016 3 23 de Março
1998 2017 4 11 de Abril
1999 2018 5 31 de Março
2000 2019 6 18 de Abril
2001 2020 7 8 de Abril
2002 2021 8 28 de Março
2003 2022 9 16 de Abril
2004 2023 10 5 de Abril
2005 2024 11 25 de Março
2006 2025 12 13 de Abril
2007 2026 13 2 de Abril
2008 2027 14 22 de Março
2009 2028 15 10 de Abril
2010 2029 16 30 de Março
2011 2030 17 17 de Abril
2012 2031 18 7 de Abril
2013 2032 19 27 de Março

Cálculo da data da Páscoa recorrendo a algoritmos

Algoritmo de Gauss

Para calcular o dia da Páscoa (Domingo), usa-se a fórmula abaixo, onde o "ANO" deve ser introduzido com 4 dígitos. O operador MOD é o resto da divisão. Os valores X e Y são retirados da tabela a seguir: [2]

Faixa de anos X Y
1582 1699 22 2
1700 1799 23 3
1800 1899 23 4
1900 2099 24 5
2100 2199 24 6
2200 2299 25 7


 a = ANO MOD 19
 b = ANO MOD 4
 c = ANO MOD 7
 d = ((19*a)+X)MOD 30
 e = ((2*b)+(4*c)+(6*d)+Y) MOD 7
 se: (d+e)<10 então o dia = (d+e+22) e mês=Março
 senão: dia=(d+e-9) e mês=Abril
 exceções:
 # quando o domingo de Páscoa calculado for 26 de Abril, corrige-se para uma semana antes, ou seja, 19 de Abril (ocorre em 2076).
 # quando o domingo de Páscoa calculado for 25 de Abril e d=28 e a>10, então a Páscoa é em 18 de Abril (ocorre em 2049).
exemplos:
Para o ano de 2024:
a=2024 MOD 19 = 10
b=2024 MOD 4 = 0
c=2024 MOD 7 = 1
d=(19 * 10 + 24) MOD 30 = 4
e=(2 * 0 + 4 *1 + 6 * 4 + 5) MOD 7 = 5
(d + e) = 4 + 5 = 9
Logo, o Domingo de Páscoa calha 9 dias depois de 22/3/2024, ou seja a 31 de março de 2024

Algoritmo de Meeus/Jones/Butcher

Outro Algoritmo, conhecido como "Meeus/Jones/Butcher", tem a vantagem de não ter exceções para o calendário gregoriano (a partir de 1583), conforme apresentado por Jean Meeus em seu livro "Astronomical Algorithms"[3]:

 a = ANO MOD 19
 b = ANO \ 100
 c = ANO MOD 100
 d = b \ 4
 e = b MOD 4
 f = (b + 8) \ 25
 g = (b - f + 1) \ 3
 h = (19 × a + b - d - g + 15) MOD 30
 i = c \ 4
 k = c MOD 4
 L = (32 + 2 × e + 2 × i - h - k) MOD 7
 m = (a + 11 × h + 22 × L) \ 451
 MÊS = (h + L - 7 × m + 114) \ 31
 DIA = 1+ (h + L - 7 × m + 114)MOD 31

Obs.: O sinal "\" refere-se à divisão obtendo o inteiro (INT). Exemplo: 7\3 é igual a 2 e não a 2,333.

Exemplo para o ano de 2008:

 a = 2008 MOD 19 = 13
 b = 2008 \ 100 = 20
 c = 2008 MOD 100 = 8
 d = 20 \ 4 = 5
 e = 20 MOD 4) = 0
 f = (20 + 8) \ 25 = 1
 g = (20 - 1 + 1) \ 3 = 6
 h = (19 × 13 + 20 - 5 - 6 + 15) MOD 30 = 1
 i = 8 \ 4 = 2
 k = 8 MOD 4 = 0
 L = (32 + 2 × 0 + 2 × 2 - 1 - 0) MOD 7 = 0
 m = (13 + 11 × 1 + 22 × 0) \ 451 = 0
 MÊS = (1 + 0 - 7 × 0 + 114) \ 31 = 3 (Março)
 DIA =1 + (1 + 0 - 7 × 0 + 114) MOD 31 + 1 = 23
 
 Ou seja, a Páscoa de 2008 caiu em 23 de Março.

Datas dos feriados móveis

A seguir temos uma tabela com todos os feriados móveis de um ano, sendo eles: Carnaval, Sexta-Feira Santa, Páscoa e Corpus Christi, do período de 1850 a 2209. [4]

Datas para feriados móveis entre os anos 1900 e 2209
AnoCarnavalSexta-feira SantaPáscoaCorpus Christi
-19001990214227 de fevereiro13 de abril15 de abril 14 de junho
--1991214312 de fevereiro29 de março31 de março 30 de maio
--199221443 de março17 de abril19 de abril 18 de junho
--1993214523 de fevereiro9 de abril11 de abril 10 de junho
--1994214615 de fevereiro1 de abril3 de abril 2 de junho
--1995214728 de fevereiro14 de abril16 de abril 15 de junho
-1901*1996214820 (19*) de fevereiro5 de abril7 de abril 6 de junho
-19021997214911 de fevereiro28 de março30 de março 29 de maio
-19031998215024 de fevereiro10 de abril12 de abril 11 de junho
--1999215116 de fevereiro2 de abril4 de abril 3 de junho
-1904--16 de fevereiro1 de abril3 de abril 2 de junho
-1905200021527 de março21 de abril23 de abril 22 de junho
-19062001215327 de fevereiro13 de abril15 de abril 14 de junho
185019072002215412 de fevereiro29 de março31 de março 30 de maio
1851-200321554 de março18 de abril20 de abril 19 de junho
-1908--3 de março17 de abril19 de abril 18 de junho
18521909*2004215624 (23*) de fevereiro9 de abril11 de abril 10 de junho
18531910200521578 de fevereiro25 de março27 de março26 de maio
185419112006215828 de fevereiro14 de abril16 de abril15 de junho
1855-2007215920 de fevereiro6 de abril8 de abril7 de junho
-1912--20 de fevereiro5 de abril7 de abril6 de junho
18561913*200821605 (4*) de fevereiro21 de março23 de março 22 de maio
185719142009216124 de fevereiro10 de abril12 de abril11 de junho
185819152010216216 de fevereiro2 de abril4 de abril3 de junho
1859-201121638 de março22 de abril24 de abril23 de junho
-1916--7 de março21 de abril23 de abril22 de junho
18601917*2012216421 (20*) de fevereiro6 de abril8 de abril 7 de junho
186119182013216512 de fevereiro29 de março31 de março30 de maio
18621919201421664 de março18 de abril20 de abril19 de junho
1863-2015216717 de fevereiro3 de abril5 de abril4 de junho
-1920--17 de fevereiro2 de abril4 de abril3 de junho
18641921*201621689 (8*) de fevereiro25 de março27 de março 26 de maio
186519222017216928 de fevereiro14 de abril16 de abril15 de junho
186619232018217013 de fevereiro30 de março1 de abril31 de maio
1867-201921715 de março19 de abril21 de abril20 de junho
-1924--4 de março18 de abril20 de abril19 de junho
18681925*2020217225 (24*) de fevereiro10 de abril12 de abril 11 de junho
1869---9 de fevereiro26 de março28 de março 27 de maio
-19262021217316 de fevereiro2 de abril4 de abril3 de junho
18701927202221741 de março15 de abril17 de abril16 de junho
1871-2023217521 de fevereiro7 de abril9 de abril8 de junho
-1928--21 de fevereiro6 de abril8 de abril7 de junho
18721929*2024217613 (12*) de fevereiro29 de março31 de março30 de maio
1873---25 de fevereiro11 de abril13 de abril 12 de junho
-1930202521774 de março18 de abril20 de abril19 de junho
187419312026217817 de fevereiro3 de abril5 de abril4 de junho
1875-202721799 de fevereiro26 de março28 de março27 de maio
-1932--9 de fevereiro25 de março27 de março26 de maio
18761933*2028218029 (28*) de fevereiro14 de abril16 de abril 15 de junho
187719342029218113 de fevereiro30 de março1 de abril31 de maio
18781935203021825 de março19 de abril21 de abril20 de junho
1879-2031218325 de fevereiro11 de abril13 de abril12 de junho
-1936--25 de fevereiro10 de abril12 de abril11 de junho
18801937*2032218410 (9*) de fevereiro26 de março28 de março 27 de maio
18811938203321851 de março15 de abril17 de abril16 de junho
188219392034218621 de fevereiro7 de abril9 de abril8 de junho
1883-203521876 de fevereiro23 de março25 de março24 de maio
-1940--6 de fevereiro22 de março24 de março23 de maio
18841941*2036218826 (25*) de fevereiro11 de abril13 de abril 12 de junho
188519422037218917 de fevereiro3 de abril5 de abril4 de junho
18861943203821909 de março23 de abril25 de abril24 de junho
1887-2039219122 de fevereiro8 de abril10 de abril 9 de junho
-1944--22 de fevereiro7 de abril9 de abril 8 de junho
18881945*2040219214 (13*) de fevereiro30 de março1 de abril 31 de maio
18891946204121935 de março19 de abril21 de abril 20 de junho
189019472042219418 de fevereiro4 de abril6 de abril 5 de junho
1891-2043219510 de fevereiro27 de março29 de março 28 de maio
-1948--10 de fevereiro26 de março28 de março 27 de maio
18921949204421961 de março15 de abril17 de abril 16 de junho
1893---14 de fevereiro31 de março2 de abril 1 de junho
-19502045219721 de fevereiro7 de abril9 de abril 8 de junho
18941951204621986 de fevereiro23 de março25 de março 24 de maio
1895-2047219926 de fevereiro12 de abril14 de abril 13 de junho
1896-2048-18 de fevereiro3 de abril5 de abril 4 de junho
1897-204920602 de março16 de abril18 de abril 17 de junho
1898-2050206122 de fevereiro8 de abril10 de abril 9 de junho
1899-2051-14 de fevereiro31 de março 2 de abril1 de junho
---20627 de fevereiro24 de março 26 de março25 de maio
--2052-5 de março19 de abril 21 de abril20 de junho
1900--206327 de fevereiro13 de abril 15 de abril14 de junho
--20532064*18 (19*) de fevereiro4 de abril 6 de abril5 de junho
--2054206510 de fevereiro27 de março 29 de março28 de maio
--2055-2 de março16 de abril 18 de abril17 de junho
---206623 de fevereiro9 de abril 11 de abril10 de junho
--2056-15 de fevereiro31 de março 2 de abril1 de junho
---206715 de fevereiro1 de abril 3 de abril2 de junho
--205720686 de março20 de abril 22 de abril21 de junho
--2058206926 de fevereiro12 de abril 14 de abril13 de junho
--2059207011 de fevereiro28 de março 30 de março29 de maio
--207120823 de março17 de abril 19 de abril18 de junho
--2072-23 de fevereiro8 de abril 10 de abril9 de junho
---208316 de fevereiro2 de abril 4 de abril3 de junho
--20732084*7 (8*) de fevereiro24 de março 26 de março25 de maio
--2074208527 de fevereiro 13 de abril 15 de abril14 de junho
1901-2075-19 de fevereiro5 de abril 7 de abril6 de junho
--2076-3 de março17 de abril 19 de abril18 de junho
---208612 de fevereiro29 de março 31 de março30 de maio
---20874 de março18 de abril 20 de abril19 de junho
--20772088*23 (24*) de fevereiro9 de abril 11 de abril10 de junho
--2078208915 de fevereiro1 de abril 3 de abril2 de junho
--2079-7 de março21 de abril 23 de abril22 de junho
--2080-20 de fevereiro5 de abril 7 de abril6 de junho
1902-2081-11 de fevereiro28 de março 30 de março29 de maio
--2090-28 de fevereiro14 de abril 16 de abril15 de junho
--2091-20 de fevereiro6 de abril 8 de abril7 de junho
--2092-12 de fevereiro28 de março 30 de março29 de maio
1903-2093-24 de fevereiro10 de abril 12 de abril11 de junho
--2094-16 de fevereiro2 de abril 4 de abril3 de junho
--2095-8 de março22 de abril 24 de abril23 de junho
--2096-28 de fevereiro13 de abril 15 de abril14 de junho
--2097-12 de fevereiro29 de março 31 de março30 de maio
--2098-4 de março18 de abril 20 de abril19 de junho
--2099-24 de fevereiro10 de abril 12 de abril11 de junho
--2100-9 de fevereiro26 de março 28 de março27 de maio
-19492101-1 de março15 de abril 17 de abril16 de junho
-19502102-21 de fevereiro7 de abril 9 de abril8 de junho
-19512103-6 de fevereiro23 de março25 de março 24 de maio
-19522104-26 de fevereiro11 de abril13 de abril 12 de junho
-19532105-17 de fevereiro3 de abril5 de abril 4 de junho
-19542106-2 de março16 de abril18 de abril 17 de junho
-19552107-22 de fevereiro8 de abril10 de abril 9 de junho
-19562108-14 de fevereiro30 de março1 de abril 31 de maio
-19572109-5 de março19 de abril21 de abril 20 de junho
-19582110220018 de fevereiro4 de abril6 de abril 5 de junho
-19592111-10 de fevereiro27 de março29 de março 28 de maio
-19602112-1 de março15 de abril17 de abril 16 de junho
-19612113-14 de fevereiro31 de março2 de abril 1 de junho
-19622114-6 de março20 de abril22 de abril 21 de junho
-19632115-26 de fevereiro12 de abril14 de abril 13 de junho
-19642116-11 de fevereiro27 de março29 de março 28 de maio
-19652117-2 de março16 de abril18 de abril 17 de junho
-19662118-22 de fevereiro8 de abril10 de abril 9 de junho
-19672119-7 de fevereiro24 de março26 de março 25 de maio
-19682120-27 de fevereiro12 de abril14 de abril 13 de junho
-19692121-18 de fevereiro4 de abril6 de abril 5 de junho
-19702122-10 de fevereiro27 de março29 de março 28 de maio
-19712123-23 de fevereiro9 de abril11 de abril 10 de junho
-19722124-15 de fevereiro31 de março2 de abril 1 de junho
-19732125-6 de março20 de abril22 de abril 21 de junho
-19742126-26 de fevereiro12 de abril14 de abril 13 de junho
-19752127-11 de fevereiro28 de março30 de março 29 de maio
-19762128-2 de março16 de abril18 de abril 17 de junho
-19772129-22 de fevereiro8 de abril10 de abril 9 de junho
-19782130-7 de fevereiro24 de março26 de março 25 de maio
-19792131-27 de fevereiro13 de abril15 de abril 14 de junho
-19802132-19 de fevereiro4 de abril6 de abril 5 de junho
-1981213322013 de março17 de abril19 de abril 18 de junho
-19822134220223 de fevereiro9 de abril11 de abril 10 de junho
-19832135220315 de fevereiro1 de abril3 de abril 2 de junho
-1984213622046 de março20 de abril22 de abril 21 de junho
-19852137220519 de fevereiro5 de abril7 de abril 6 de junho
-19862138220611 de fevereiro28 de março30 de março 29 de maio
-1987213922073 de março17 de abril19 de abril 18 de junho
190419882140220816 de fevereiro1 de abril3 de abril 2 de junho
-1989214122097 de fevereiro24 de março26 de março 25 de maio
Nota: Para anos assinalados com asterisco (*) o Carnaval calha no dia assinalado entre parênteses.

Uma forma de aplicação do Algoritmo de Meeus/Jones/Butcher, direta e acessível para a maioria das pessoas que utilizam computadores, é a adaptação de Claytom Valle para ser mostrada numa única célula da planilha Excel®, da Microsoft. Basta copiar o conjunto abaixo (exatamente como mostrado, sem espaços) e colar na célula onde se espera que seja exibida a data da Páscoa. Nesse exemplo, considerou-se uma célula chamada "Ano" (definida através da opção "Definir Nome" do Excel®), mas pode-se substituir todas as palavras "Ano" pela célula que contenha o ano desejado (como por exemplo "A1", sem aspas):

=DATA(ano;INT((MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30)+MOD((32+(2*MOD(INT(ano/100);4))+(2*INT(MOD(ano;100)/4))-(MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))-(MOD(MOD(ano;100);4)));7)-(7*INT(((MOD(ano;19))+(11*MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))+(22*MOD((32+(2*MOD(INT(ano/100);4))+(2*INT(MOD(ano;100)/4))-(MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))-(MOD(MOD(ano;100);4)));7)))/451))+114)/31);MOD((MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30)+MOD((32+(2*MOD(INT(ano/100);4))+(2*INT(MOD(ano;100)/4))-(MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))-(MOD(MOD(ano;100);4)));7)-(7*INT(((MOD(ano;19))+(11*MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))+(22*MOD((32+(2*MOD(INT(ano/100);4))+(2*INT(MOD(ano;100)/4))-(MOD((19*(MOD(ano;19))+(INT(ano/100))-(INT(INT(ano/100)/4))-(INT((INT(ano/100)-(INT((INT(ano/100)+8)/25))+1)/3))+15);30))-(MOD(MOD(ano;100);4)));7)))/451))+114);31)+1)

Observação: devido à limitação do Excel em relação à Função "Data", a fórmula acima só funciona entre os anos 1900 e 9999.

Abaixo, o Algoritmo convertido para a linguagem "Transact-SQL Server". Poderá também ser adaptado para qualquer outra linguagem de programação:

 CREATE FUNCTION fncPascoa (@ANO int)
 RETURNS datetime
 AS
 BEGIN
 DECLARE @DATA AS DATETIME
 DECLARE @MES AS INT
 DECLARE @DIA AS INT
 DECLARE @A AS INT
 DECLARE @B AS INT
 DECLARE @C AS INT
 DECLARE @D AS INT
 DECLARE @E AS INT
 DECLARE @F AS INT
 DECLARE @G AS INT
 DECLARE @H AS INT
 DECLARE @I AS INT
 DECLARE @K AS INT
 DECLARE @L AS INT
 DECLARE @M AS INT
 SET @A = @ANO%19
 SET @B = @ANO/100
 SET @C = @ANO%100
 SET @D = @B/4
 SET @E = @B%4
 SET @F = (@B+8)/25
 SET @G = (@B-@F+1)/3
 SET @H = (19*@A+@B-@D-@G+15)%30
 SET @I = @C/4
 SET @K = @C%4
 SET @L = (32+2*@E+2*@I-@H-@K)%7
 SET @M = (@A+11*@H+22*@L)/451
 SET @MES = (@H+@L-7*@M+114)/31
 SET @DIA = ((@H+@L-7*@M+114)%31)+1
 SET @DATA = CAST((LTRIM(RTRIM(CAST(@ANO AS CHAR)))) + '-' + 
 (LTRIM(RTRIM(CAST(@MES AS CHAR)))) + '-' + 
 (LTRIM(RTRIM(CAST(@DIA AS CHAR)))) AS DATETIME)
 RETURN(@DATA)
 END;
 GO

R

Exemplo de códico em R

  require(lubridate)
  easterDay <- function(year){
  a <- year %% 19
  b <- floor(year / 100)
  c <- year %% 100
  
  d <- floor(b / 4)
  e <- b %% 4
  
  f <- floor((b + 8) / 25)
  
  g <- floor((b - f + 1)/3)
  
  h <- (19*a + b - d - g + 15) %% 30
  
  i <- floor(c / 4)
  k <- c %% 4 
  
  l <- (32 + 2 * e + 2 * i - h - k) %% 7
  
  m <- floor((a + 11*h + 22*l)/451)
  
  n <- floor((h + l - 7*m + 114)/31)
  
  p <- (h + l - 7*m + 114) %% 31
  
  return(c(as.character(month(n, label = TRUE)), p + 1))  
}

Exemplo de utilização, easterDay(2018), retorna o vetor "Apr" "1".

C#

Exemplo de código em C#

public static string Calcula(int nAno) {
  int nRest = (nAno % 19) + 1;
  DateTime oDia = new DateTime();
  switch (nRest) {
    case  1: oDia = new System.DateTime(nAno, 4, 14, 0, 0, 0, 0); break;
    case  2: oDia = new System.DateTime(nAno, 4,  3, 0, 0, 0, 0); break;
    case  3: oDia = new System.DateTime(nAno, 3, 23, 0, 0, 0, 0); break;
    case  4: oDia = new System.DateTime(nAno, 4, 11, 0, 0, 0, 0); break;
    case  5: oDia = new System.DateTime(nAno, 3, 31, 0, 0, 0, 0); break;
    case  6: oDia = new System.DateTime(nAno, 4, 18, 0, 0, 0, 0); break;
    case  7: oDia = new System.DateTime(nAno, 4,  8, 0, 0, 0, 0); break;
    case  8: oDia = new System.DateTime(nAno, 3, 28, 0, 0, 0, 0); break;
    case  9: oDia = new System.DateTime(nAno, 4, 16, 0, 0, 0, 0); break;
    case 10: oDia = new System.DateTime(nAno, 4,  5, 0, 0, 0, 0); break;
    case 11: oDia = new System.DateTime(nAno, 3, 25, 0, 0, 0, 0); break;
    case 12: oDia = new System.DateTime(nAno, 4, 13, 0, 0, 0, 0); break;
    case 13: oDia = new System.DateTime(nAno, 4,  2, 0, 0, 0, 0); break;
    case 14: oDia = new System.DateTime(nAno, 3, 22, 0, 0, 0, 0); break;
    case 15: oDia = new System.DateTime(nAno, 4, 10, 0, 0, 0, 0); break;
    case 16: oDia = new System.DateTime(nAno, 3, 30, 0, 0, 0, 0); break;
    case 17: oDia = new System.DateTime(nAno, 4, 17, 0, 0, 0, 0); break;
    case 18: oDia = new System.DateTime(nAno, 4,  7, 0, 0, 0, 0); break;
    case 19: oDia = new System.DateTime(nAno, 3, 27, 0, 0, 0, 0); break;
  }
  string cRet = ""; 
  for (int n = 1; n <= 13; n++) {
    oDia= oDia.AddDays(1);
    if (oDia.DayOfWeek == DayOfWeek.Sunday) {
      cRet = oDia.Day.ToString();
      cRet += oDia.Month == 3 ? " de março" : " de abril";
    
      return cRet;
    }
  } 
  return "";
}


PHP

Exemplo de código em PHP, o PHP possui nativamente um recurso para obter a data da páscoa, sendo:

date("d-m-Y", easter_date($Ano));

Porém, a função easter_date() pode retornar a data incorreta dependendo do fuso horário do servidor. Para corrigir isto, pode-se usar o seguinte código (compatível com PHP 5.3+):

function findPascoa($ano)
{
  $date = new DateTime('now', new DateTimeZone('UTC'));
  $date->setTimestamp(easter_date($ano));
  return $date->format('d-m-Y');
}

Exemplo manual de cálculo para obter a data da Páscoa:

/**
  * Anos de 1582 a 1599 X=22 e Y=2
  * Anos de 1600 a 1699 X=22 e Y=2
  * Anos de 1700 a 1799 X=23 e Y=3
  * Anos de 1800 a 1899 X=24 e Y=4
  * Anos de 1900 a 1999 X=24 e Y=5
  **> Anos de 2000 a 2099 X=24 e Y=5 <**
  * Anos de 2100 a 2199 X=24 e Y=6
  * Anos de 2200 a 2299 X=25 e Y=7
  * 
  */
function findPascoa($ano)
{
  $X = 24;
  $Y = 5;

  $a = ($ano % 19);
  $b = ($ano % 4);
  $c = ($ano % 7);
  $d = ((19 * $a + $X) % 30);
  $e = ((2 * $b + 4 * $c + 6 * $d + $Y) % 7);
  
  if (($d + $e) > 9) { $dia = ($d + $e - 9); $mes = 4; } else { $dia = ($d + $e + 22); $mes = 3; }
  if (($dia == 26) AND ($mes == 4)) { $dia = 19; }
  if (($dia == 25) AND ($mes == 4) AND ($d == 28) AND ($a > 10)) { $dia = 18; }
  
  return sprintf("%02d-%02d-%04d", $dia, $mes, $ano);
}

PL/SQL

Exemplo de código em PL/SQL

 SET SERVEROUTPUT ON;
 DECLARE
 MES number;
 DIA number;
 A   number;
 B   number;
 C   number;
 D   number;
 E   number;
 F   number;
 G   number;
 H   number;
 I   number;
 K   number;
 L   number;
 M   number;
 ANO NUMBER;
 DATA_PASCOA DATE;
BEGIN
    ANO:= 2021; /*ESTE PARAMETRO EH O ANO PARA O QUAL SE DESEJA CALCULAR A DATA DE PASCOA*/
    A := MOD(ANO, 19);
    B := TRUNC(ANO/100);
    C := MOD(ANO, 100);
    D := TRUNC(B/4);
    E := MOD(B, 4);
    F := TRUNC((B+8)/25);
    G := TRUNC((B-F+1)/3);
    H := MOD((19*A+B-D-G+15), 30);
    I := TRUNC(C/4);
    K := MOD(C, 4);
    L := MOD((32+2*E+2*I-H-K),7);
    M := TRUNC((A+11*H+22*L)/451);
    MES := TRUNC((H+L-7*M+114)/31);
    DIA := MOD((H+L-7*M+114), 31) + 1;
    
    /*
    SYS.DBMS_OUTPUT.put_line('A= '||A);
    SYS.DBMS_OUTPUT.put_line('B= '||B);
    SYS.DBMS_OUTPUT.put_line('C= '||C);
    SYS.DBMS_OUTPUT.put_line('D= '||D);
    SYS.DBMS_OUTPUT.put_line('E= '||E);
    SYS.DBMS_OUTPUT.put_line('F= '||F);
    SYS.DBMS_OUTPUT.put_line('G= '||G);
    SYS.DBMS_OUTPUT.put_line('H= '||H);
    SYS.DBMS_OUTPUT.put_line('I= '||I);
    SYS.DBMS_OUTPUT.put_line('K= '||K);
    SYS.DBMS_OUTPUT.put_line('L= '||L);
    SYS.DBMS_OUTPUT.put_line('M= '||M);
    */
 
    DATA_PASCOA := TO_DATE(LPAD(DIA,2,'0')||'/'||LPAD(MES,2,'0')||'/'||ANO, 'DD/MM/YYYY');
 
    SYS.DBMS_OUTPUT.put_line('DATA_PASCOA = '||DATA_PASCOA );
 
 END;
 /

JAVA

Exemplo de código em Java

/*
@param ano o ano para calcular 
*/
private void dataPascoa_Carnaval(int ano) {
	GregorianCalendar data_Pascoa = new GregorianCalendar();
	GregorianCalendar data_Carnaval = new GregorianCalendar();
	GregorianCalendar data_CorpusChristi = new GregorianCalendar();
	GregorianCalendar data_SextaFeiraSanta = new GregorianCalendar();

		int a = ano % 19;
		int b = ano / 100;
		int c = ano % 100;
		int d = b / 4;
		int e = b % 4;
		int f = (b + 8) / 25;
		int g = (b - f + 1) / 3;
		int h = (19 * a + b - d - g + 15) % 30;
		int i = c / 4;
		int k = c % 4;
		int l = (32 + 2 * e + 2 * i - h - k) % 7;
		int m = (a + 11 * h + 22 * l) / 451;
		int mes = (h + l - 7 * m + 114) / 31;
		int dia = ((h + l - 7 * m + 114) % 31) + 1;

		data_Pascoa.set(Calendar.YEAR, ano);
		data_Pascoa.set(Calendar.MONTH, mes-1);
		data_Pascoa.set(Calendar.DAY_OF_MONTH, dia);
		
		//Carnaval 47 dias antes da pascoa
		data_Carnaval.setTimeInMillis(data_Pascoa.getTimeInMillis());
		data_Carnaval.add(Calendar.DAY_OF_MONTH, -47);
		//CorpusChristi 60 dias apos a pascoa
		data_CorpusChristi.setTimeInMillis(data_Pascoa.getTimeInMillis());
		data_CorpusChristi.add(Calendar.DAY_OF_MONTH, 60);
		
		data_SextaFeiraSanta.setTimeInMillis(data_Pascoa.getTimeInMillis());
		data_SextaFeiraSanta.add(Calendar.DAY_OF_MONTH, -2);
	}

JavaScript

Exemplo de código em Javascript

function easterSunday (year) {
 var X=0;
 var Y=0;
 
 if (year>=1582 && year<=1699){X = 22; Y = 2;}
 if (year>=1700 && year<=1799){X = 23; Y = 3;}
 if (year>=1800 && year<=1899){X = 23; Y = 4;}
 if (year>=1900 && year<=2099){X = 24; Y = 5;}
 if (year>=2100 && year<=2199){X = 24; Y = 6;}
 if (year>=2200 && year<=2299){X = 25; Y = 7;}
 
 var a = yeara% 19;
 var b = yearv% 4;
 var c = year % 7;
 var d = ((19*a)+X)d% 30;
 var e = (((2*b)+(4*c)+(6*d)+Y))%7;
 
 var day;
 var month;
 if ((d+e)<10) { 
 day = d+e+22; 
 month = 3;
 }
 else {
 day = d+e-9; 
 month = 4;
 }
 //26 of april 2076
 if (day==26 && month==4) {
 day = 19;
 }
 
 //25 of april 2049
 if (day==25 && month==4 && d==28 && a>10) {
 day = 18;
 }
 
 return new Date(year, month-1, day, 0, 0, 0, 0);
}

Excel®

Há tres formas mais simples utilizando funções do Excel® para retornar a data da páscoa, sendo a segunda bastante curiosa. Ambas consideram que na célula "A1" esteja o ano desejado, mas apenas funcionam entre os anos 1900 e 9999.

A primeira fórmula:

=ARRED(DATA(A1;4;1)/7+MOD(19*MOD(A1;19)-7;30)*14%;0)*7-6 
Excel versão português europeu substituir MOD por RESTO

A segunda fórmula:

=MOEDA(("4/"&A1)/7+MOD(19*MOD(A1;19)-7;30)*14%;)*7-6 
Excel versão português europeu substituir MOD por RESTO

A terceira fórmula:

=ARREDMULTB(DIA(MINUTO(A1/38)/2+56)&"/5"&"/"&A1;7)-34 
Excel versão português europeu substituir ARREDMULTB por ARRED.DEFEITO


Para retornar o dia do carnaval, basta subtrair 47 dias da data da Páscoa. Corpus Christi pode ser obtido somando-se 60 dias à data da Páscoa.

SQLite

Exemplo de código para cálculo da data da Páscoa em 2018:

SELECT
  DATE(anoMesDia, "+" || (7 - STRFTIME("%w", anoMesDia)) || " days") AS pascoa
FROM (
  SELECT
  ano || SUBSTR(mesDia, 1 + (ano % 19) * 6, 6) AS anoMesDia
  FROM (
  SELECT
  "-04-14-04-03-03-23-04-11-03-31-04-18-04-08-03-28-04-16-04-05-03-25-04-13-04-02-03-22-04-10-03-30-04-17-04-07-03-27" AS mesDia,
  2018 AS ano));

Referências

  1. Astronomical Society of South Australia. «List of Easter Sunday Dates». Consultado em 9 de abril de 2015
  2. Art Johnson (1999). Famous Problemas and Their Mathematicians. Greenwood Village, Colorado: Teachers Ideas press. pp. 11,12. ISBN 978-1563084461
  3. Jean Meeus (1991). Astronomical Algorithms. Richmond, Virginia: Willmann-Bell. p. 67–68
  4. GM Arts. «Easter Sunday Date FAQ». Consultado em 11 de abril de 2015
This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.