6 de dez. de 2008

Feriados móveis

Estava abrindo minhas correspondências essa semana e achei um envelope do meu contador, que recebo todo ano em Dezembro, um calendário do ano seguinte (e um boleto bancário do 13º, óbvio).

Daí comecei a ver os feriados do ano que vem, e que são muitos.
Lembrei de uma coisa interessante, que nem todo mundo sabe: como calcular feriados móveis.

Apenas por curiosidade, os calendários são baseados em eventos astrológicos, e obviamente a mudança dos feriados móveis também é baseada em cálculos astrológicos.

Muita gente se pergunta porque o Carnaval sempre cai num dia diferente todo ano, as vezes até em outro mês.

A base de todos feriados móveis é a data da Páscoa.

Carnaval = Páscoa – 47 dias
Sexta Feira Santa = Páscoa – 2 dias
CorpusChristi =   Páscoa + 60 dias

A data também é móvel e é calculada através de uma fórmula muito doida.
Encontrei uns documentos antigos na minha pesquisa e fiz uma rotina em Visual Basic há muito tempo (no mínimo uns 10 anos).
Hoje resolvei convertê-la pra C# para utilizar em um sistema que estou trabalhando.

Vamos ao código:

static void Main(string[] args)
{
DateTime dtPascoa = DataPascoa(2009);
DateTime dtCarnaval = dtPascoa.AddDays(-47);
DateTime dtSextaSanta = dtPascoa.AddDays(-2);
DateTime dtCorpusChristi = dtPascoa.AddDays(60);
Console.WriteLine(string.Format("Páscoa: {0}", dtPascoa.ToLongDateString()));
Console.WriteLine(string.Format("Carnaval: {0}", dtCarnaval.ToLongDateString()));
Console.WriteLine(string.Format("Sexta-Feira Santa: {0}", dtSextaSanta.ToLongDateString()));
Console.WriteLine(string.Format("Corpus Christi: {0}", dtCorpusChristi.ToLongDateString()));
Console.ReadKey();
}
O código do cálculo da Páscoa
static DateTime DataPascoa(int nYear)
{
int nGold = 0;
int nCent = 0;
int nCorx = 0;
int nCorz = 0;
int nSunday = 0;
int nEpact = 0;
int nMoon = 0;
int nMonth = 0;
int nDay = 0;

// nGold, é o Golden number
nGold = (nYear % 19) + 1;

// nCent é o Século
nCent = (nYear / 100) + 1;

// nCorx é o número de anos em que o bissexto foi retirado para sincronizar
nCorx = ((3 * nCent) / 4 - 12);

// nCorz é uma correção para sincronizar a Páscoa com a órbita da Lua
nCorz = ((8 * nCent + 5) / 25 - 5);
nSunday = ((5 * nYear) / 4 - nCorx - 10);

// nEpact é a ocorrencia de uma Lua cheia
nEpact = ((11 * nGold + 20 + nCorz - nCorx) % 30);

if (nEpact < 0)
nEpact = nEpact + 30;

if (((nEpact == 25) && (nGold > 11)) || (nEpact == 24))
nEpact = nEpact + 1;

// Lua cheia - a n ésima lua de Março é o calendário da lua cheia
nMoon = 44 - nEpact;

if (nMoon < 21)
nMoon = nMoon + 30;

// Avança ao domingo
nMoon = (nMoon + 7 - ((nSunday + nMoon) % 7));

// obtém o mês e o dia
if (nMoon > 31)
{
nMonth = 4;
nDay = nMoon - 31;
}
else
{
nMonth = 3;
nDay = nMoon;
}

return new DateTime(nYear, nMonth, nDay);

}

Technorati Tags: ,,

Postar um comentário