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

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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);     }
}
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
alxsts
Colaborador
Colaborador
Mensagens: 3092
Registrado em: 12 Ago 2008 15:50
Localização: São Paulo-SP-Brasil

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

Mensagem por alxsts »

Olá!

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

Páscoa Matemática
The Christian Calendar - Easter
Easter
Computus
[]´s
Alexandre Santos (AlxSts)
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
Avatar do usuário
JoséQuintas
Administrador
Administrador
Mensagens: 20267
Registrado em: 26 Fev 2007 11:59
Localização: São Paulo-SP

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

Mensagem 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
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"

https://github.com/JoseQuintas/
esbasso
Colaborador
Colaborador
Mensagens: 325
Registrado em: 24 Jan 2007 17:49
Localização: CHAPECO/SC

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

Mensagem 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)
Luis Fernando Basso
Desenvolvedor VFP + XHARBOUR + HWGUI
lfbasso@gmail.com
http://www.engersoft.com.br
Avatar do usuário
janio
Colaborador
Colaborador
Mensagens: 1846
Registrado em: 06 Jul 2004 07:43
Localização: UBAJARA - CE

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

Mensagem por janio »

Luis Fernando Basso...

Bom te 'ver' de novo. Andou sumidaooo
fui...
e-mail:janioaguiar@yahoo.com.br
msn: janio_aguiar@hotmail.com
xHarbour1.2.1/Harbour3.2 + wvg + hwgui + Mediator + MySql
Avatar do usuário
Itamar M. Lins Jr.
Administrador
Administrador
Mensagens: 7929
Registrado em: 30 Mai 2007 11:31
Localização: Ilheus Bahia
Curtiu: 1 vez

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

Mensagem 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.
Saudações,
Itamar M. Lins Jr.
esbasso
Colaborador
Colaborador
Mensagens: 325
Registrado em: 24 Jan 2007 17:49
Localização: CHAPECO/SC

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

Mensagem por esbasso »

Abraços a todos
Estamos ai, na luta e a disposição
Eu ainda firme com a HWGUI porque funciona redondo hehe
Luis Fernando Basso
Desenvolvedor VFP + XHARBOUR + HWGUI
lfbasso@gmail.com
http://www.engersoft.com.br
Avatar do usuário
Antonio
Usuário Nível 3
Usuário Nível 3
Mensagens: 347
Registrado em: 14 Ago 2003 17:33
Localização: Sao Paulo - SP
Contato:

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

Mensagem por Antonio »

Ola Luis Basso!

Qual o changelog dessa versão que funciona redondo?
Abraço.
Antonio Carlos
Harbour 3.2 (20180213)
Hwgui 2.20 3b | PostGresql 9.5 | ADO/ODBC
Responder