Peppe Pace

Programmazione e festività

leave a comment »

Chi non ha mai avuto la necessità di sapere se una determinata data era un giorno lavorativo o meno? Facile trovare l’elenco delle festività italiane su wikipedia (se l’internazionalizzazione non è un requisito indispensabile) ma come fare con la Pasqua? La Pasqua è la domenica successiva al primo plenilunio successivo all’Equinozio di Primavera. Da questa definizione è possibile risalire ad un algortimo implementabile che consenta il calcolo della data? Certo che no. Approfondendo le ricerche si approda a questa pagina, dove è descritto l’algoritmo di Oudin-Tondering per il calcolo della data della Pasqua, che è facilmente implementabile con una semplice funzione. Ecco la mia implementazione in C#:

public DateTime GetEaster(int year)
{
    int g = year % 19;
    int c = year / 100;
    int h = (c - c / 4 - (8 * c + 13) / 25 + 19 * g + 15) % 30;
    int i = h - (h / 28 ) * (1 - (29 / (h + 1)) * ((21 - g) / 11));
    int j = (year + year / 4 + i + 2 - c + c / 4) % 7;
    int l = i - j;
    int month = 3 + (l + 40) / 44;
    int day = l + 28 - 31 * (month / 4);

    return new DateTime(year,month,day);
}

Definita questa funzione diventa facile definire la funzione che in ingresso riceve una data e restituisce un valore booleano che indica se è una data festiva o comunque considerata tale e quindi non lavorativa:

public bool IsHoliday(DateTime day)
{
bool isHoliday = false;
DateTime[] festivita = {
new DateTime(day.Year, 1, 1),//Capodanno
new DateTime(day.Year, 1, 6),//Epifania
GetEaster(day.Year),//Pasqua
GetEaster(day.Year).AddDays(1),//Lunedì dell’Angelo
new DateTime(day.Year, 4, 25),//Festa della Liberazione
new DateTime(day.Year, 5, 1),//Festa dei lavoratori
new DateTime(day.Year, 6, 2),//Festa della Repubblica
new DateTime(day.Year, 8, 15),//Ferragosto
new DateTime(day.Year, 11, 1),//Ognissanti
new DateTime(day.Year, 12, 8 ),//Immacolata Concezione
new DateTime(day.Year, 12, 25),//Natale
new DateTime(day.Year, 12, 26)//Santo Stefano
};

for (int i = 0; i < festivita.Length; i++) { isHoliday = isHoliday || (day.CompareTo(festivita[i]) == 0); } return (isHoliday || ((day.DayOfWeek == DayOfWeek.Saturday) || (day.DayOfWeek == DayOfWeek.Sunday))); }[/sourcecode] Queste le funzioni, sono semplici e sicuramente migliorabili e sono a vostra disposizione. Buon lavoro

Annunci

Written by Peppe Pace

venerdì 19 ottobre 2007 a 13:31

Pubblicato su .NET, Sviluppo

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

%d blogger hanno fatto clic su Mi Piace per questo: