Página 1 de 1

Cálculo de Carnaval e Horário de Verão

Enviado: 28 Fev 2014 19:44
por JoséQuintas
Peguei isto na net.
Queria confirmar o cálculo, e a conversão pra Harbour.
Tinha este link de referência, mas aqui não funciona: http://blog.inspira.com.br/2009/03/algo ... rario.html

Código postado C#

Código: Selecionar todos

/// <summary>
/// Retorna o domingo de páscoa de um determinado ano
/// </summary>

public static DateTime DomingoDePascoa(int ano)

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

/// <summary>
/// Retorna o domingo de carnaval de um determinado ano
/// </summary>

public static DateTime DomingoDeCarnaval(int ano)

{     return DomingoDePascoa(ano).AddDays(-49);
}

/// <summary>
/// Retorna a data de início do horário de verão de um determinado ano
/// </summary>

public static DateTime InicioHorarioVerao(Int32 ano)

{     // terceiro domingo de outubro     DateTime primeiroDeOutubro = new DateTime(ano, 10, 1);     DateTime primeiroDomingoDeOutubro = primeiroDeOutubro.AddDays((7 - (Int32)primeiroDeOutubro.DayOfWeek) % 7);     DateTime terceiroDomingoDeOutubro = primeiroDomingoDeOutubro.AddDays(14);     return terceiroDomingoDeOutubro;
}

/// <summary>
/// Retorna a data de término do horário de verão de um determinado ano
/// </summary>

public static DateTime TerminoHorarioVerao(Int32 ano)

{     DateTime primeiroDeFevereiro = new DateTime(ano + 1, 2, 1);     DateTime primeiroDomingoDeFevereiro = primeiroDeFevereiro.AddDays((7 - (Int32)primeiroDeFevereiro.DayOfWeek) % 7);     DateTime terceiroDomingoDeFevereiro = primeiroDomingoDeFevereiro.AddDays(14);     if (terceiroDomingoDeFevereiro != DomingoDeCarnaval(ano))     {         return terceiroDomingoDeFevereiro;     }     else     {         return terceiroDomingoDeFevereiro.AddDays(7);     }
}

Cálculo de Carnaval e Horário de Verão

Enviado: 28 Fev 2014 20:01
por JoséQuintas
Código que converti pra Harbour

Código: Selecionar todos

 
#pragma -w3
#pragma -es2

PROCEDURE Main
   SET DATE BRITISH
   ? "Domingo de Pascoa:    ", DomingoDePascoa( 2014 )
   ? "Domingo de Carnaval:  ", DomingoDeCarnaval( 2014 )
   ? "Inicio Horario Verao: ", InicioHorarioVerao( 2014 )
   ? "Termino Horario Verao:", TerminoHorarioVerao( 2014 )
   RETURN


FUNCTION DomingoDePascoa( iAno )
   LOCAL iA, iB, iC, iD, iE, iF, iG, iH, iI, iK, iL, iM, iMes, iDia

   iA   := iAno % 19
   iB   := Int( iAno / 100 )
   iC   := iAno % 100
   iD   := Int( iB / 4 )
   iE   := iB % 4
   iF   := Int( ( iB + 8 ) / 25 )
   iG   := Int( ( iB - iF + 1 ) / 3 )
   iH   := (19 * iA + iB - iD - iG + 15) % 30
   iI   := Int( iC / 4 )
   iK   := iC % 4
   iL   := ( 32 + 2 * iE + 2 * iI - iH - iK ) % 7
   iM   := Int( ( iA + 11 * iH + 22 * iL) / 451 )
   iMes := Int( ( iH + iL - 7 * iM + 114 ) / 31 )
   iDia := ( ( iH + iL - 7 * iM + 114 ) % 31 ) + 1
   RETURN Ctod( StrZero( iDia, 2 ) + "/" + StrZero( iMes, 2 ) + "/" + StrZero( iAno, 4 ) )


FUNCTION DomingoDeCarnaval( iAno )
   RETURN DomingoDePascoa( iAno ) - 49


FUNCTION InicioHorarioVerao( iAno ) // Terceiro domingo de outubro
   LOCAL dPrimeiroDeOutubro, dPrimeiroDomingoDeOutubro, dTerceiroDomingoDeOutubro

   dPrimeiroDeOutubro := Ctod( "01/10/" + StrZero( iAno, 4 ) )
   dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + ( 7 - Dow( dPrimeiroDeOutubro ) % 7 )
   dTerceiroDomingoDeOutubro := dPrimeiroDomingoDeOutubro + 14
   RETURN dTerceiroDomingoDeOutubro


FUNCTION TerminoHorarioVerao( iAno )
   LOCAL dPrimeiroDeFevereiro, dPrimeiroDomingoDeFevereiro, dTerceiroDomingoDeFevereiro
   dPrimeiroDeFevereiro := Ctod( "01/02/" + StrZero( iAno + 1, 4 ) )
   dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + ( 7 - Dow( dPrimeiroDeFevereiro ) % 7 )
   dTerceiroDomingoDeFevereiro := dPrimeiroDomingoDeFevereiro + 14
   IF dTerceiroDomingoDeFevereiro == DomingoDeCarnaval( iAno )
      dTerceiroDomingoDeFevereiro += 7
   ENDIF
   RETURN dTerceiroDomingoDeFevereiro
Resultado:

Domingo de Pascoa: 20/04/14
Domingo de Carnaval: 02/03/14
Inicio Horario Verao: 18/10/14
Termino Horario Verao: 21/02/15

Nota à moderação:
Se juntar os dois posts em um, o preview fica ok, mas a visualização final após postado fica muito lenta.
Cheguei até a pensar que estava falhando, pois mostra sem formação, e demora um pouco pra formatar.
Separados ficou várias vezes mais rápido, sem problema de lentidão.

Cálculo de Carnaval e Horário de Verão

Enviado: 28 Fev 2014 20:58
por alxsts
Olá!

Para quem se interessar, tem explicações nos links abaixo:

Páscoa Matemática
The Christian Calendar - Easter
Easter
Computus

Cálculo de Carnaval e Horário de Verão

Enviado: 01 Mar 2014 08:25
por JoséQuintas
Acrescentar no post um trecho do endereço em português citado:

"Temos a partir do dia da Páscoa, muitas outras datas comemorativas que são estabelecidas"
"Dois dias antes do domingo de Páscoa é a Sexta-Feira Santa. Quarenta dias antes é a Quarta-Feira de Cinzas e, portanto, 43 dias antes, o Carnaval e o dia de Corpus Christi acontece 60 dias depois da Páscoa. "

"Todos os feriados eclesiásticos são calculados em função da data da Páscoa, com exceção do Natal. O Domingo de Páscoa ocorre no primeiro domingo após a primeira lua cheia que se verificar a partir do equinócio da primavera (no hemisfério norte) ou do equinócio do outono (no hemisfério sul), e a Sexta-Feira da Paixão é a que antecede o Domingo de Páscoa. A Terça-Feira de Carnaval ocorre 47 dias antes da Páscoa"

Com base nessa informação, poderemos obter essas outras datas também.

Pra complicar: o cálculo do carnaval está diferente em cada texto.

Cálculo de Carnaval e Horário de Verão

Enviado: 01 Mar 2014 11:06
por JoséQuintas
A rotina calcula domingo de carnaval, mas o carnaval é considerado terça.
Este texto tem as datas de 2009 pra frente.
A diferença de dois dias na rotina não é diferença, já que a rotina mostra domingo de carnaval, e não terça de carnaval.
Então páscoa que é a base está ok, só decidir sobre domingo ou terça de carnaval.

http://pt.wikipedia.org/wiki/Carnaval

2009 24 de fevereiro
2010 16 de fevereiro
2011 8 de março
2012 21 de fevereiro
2013 12 de fevereiro
2014 4 de março
2015 17 de fevereiro
2016 9 de fevereiro
2017 28 de fevereiro
2018 13 de fevereiro
2019 5 de março
2020 25 de fevereiro
2021 16 de fevereiro
2022 1 de março
2023 21 de fevereiro
2024 13 de fevereiro

usando a rotina:

Código: Selecionar todos

 FOR nCont = 2009 TO 2024
    ? "Terça de Carnaval: ", DomingoDeCarnaval( nCont ) + 2
 NEXT
Resultado:

Terca de Carnaval: 24/02/09
Terca de Carnaval: 16/02/10
Terca de Carnaval: 08/03/11
Terca de Carnaval: 21/02/12
Terca de Carnaval: 12/02/13
Terca de Carnaval: 04/03/14
Terca de Carnaval: 17/02/15
Terca de Carnaval: 09/02/16
Terca de Carnaval: 28/02/17
Terca de Carnaval: 13/02/18
Terca de Carnaval: 05/03/19
Terca de Carnaval: 25/02/20
Terca de Carnaval: 16/02/21
Terca de Carnaval: 01/03/22
Terca de Carnaval: 21/02/23
Terca de Carnaval: 13/02/24

Cálculo de Carnaval e Horário de Verão

Enviado: 15 Set 2014 14:23
por esbasso
Corrigindo o código

dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + ( 7 - Dow( dPrimeiroDeOutubro ) % 7 )
por
dPrimeiroDomingoDeOutubro := dPrimeiroDeOutubro + IIF( Dow( dPrimeiroDeOutubro ) = 1, 0, ;
( 7 - Dow( dPrimeiroDeOutubro ) + 1 ) )

dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + ( 7 - Dow( dPrimeiroDeFevereiro ) % 7 )
por
dPrimeiroDomingoDeFevereiro := dPrimeiroDeFevereiro + IIF( Dow( dPrimeiroDeFevereiro ) = 1, 0, ;
( 7 - Dow( dPrimeiroDeFevereiro ) + 1 ) )

e
IF dTerceiroDomingoDeFevereiro == DomingoDeCarnaval( iAno )
por
IF dTerceiroDomingoDeFevereiro == DomingoDeCarnaval( iAno + 1)

Cálculo de Carnaval e Horário de Verão

Enviado: 17 Set 2014 14:58
por janio
Luis Fernando Basso...

Bom te 'ver' de novo. Andou sumidaooo

Cálculo de Carnaval e Horário de Verão

Enviado: 17 Set 2014 17:50
por Itamar M. Lins Jr.
Aí é o GURU Brasileiro da Hwgui!!!
Sabe muito.
O Russo foi quem atropelou tudo re-começou num gás e depois parou :(
Até postei um provável fix na Hwgui 2.18 mas quando acesso a devel-list só escuto o barulho dos grilos cri-cri-cri...

Saudações,
Itamar M. Lins Jr.

Cálculo de Carnaval e Horário de Verão

Enviado: 23 Set 2014 10:17
por esbasso
Abraços a todos
Estamos ai, na luta e a disposição
Eu ainda firme com a HWGUI porque funciona redondo hehe

Cálculo de Carnaval e Horário de Verão

Enviado: 23 Set 2014 10:31
por Antonio
Ola Luis Basso!

Qual o changelog dessa versão que funciona redondo?
Abraço.