Cette fonction retourne un boolean à FALSE si le date passée en paramètre est un jour férié ou un dimanche
J'ai utilisé de nombreux exemples pour essayer de simplifier au maximum la fonction.
La formule utilisé pour calculer pâques :
http://www.auduteau.net/calendar/cal2_9_3.shtml
Source / Exemple :
private bool bolIsWorkingDay(DateTime dtDate)
{
bool bolWorkingDay = true;
Array arrDateFerie = Array.CreateInstance(typeof(DateTime),8);
// 01 Janvier
arrDateFerie.SetValue( new DateTime(dtDate.Year,1,1),0);
// 01 Mai
arrDateFerie.SetValue( new DateTime(dtDate.Year,5,1),1);
// 08 Mai
arrDateFerie.SetValue( new DateTime(dtDate.Year,5,8),2);
// 14 Juillet
arrDateFerie.SetValue( new DateTime(dtDate.Year,7,14),3);
// 15 Aout
arrDateFerie.SetValue( new DateTime(dtDate.Year,8,15),4);
// 01 Novembre
arrDateFerie.SetValue( new DateTime(dtDate.Year,11,1),5);
// 11 Novembre
arrDateFerie.SetValue( new DateTime(dtDate.Year,11,11),6);
// Noël
arrDateFerie.SetValue( new DateTime(dtDate.Year,12,25),7);
// Dimanche ou jour férié
bolWorkingDay = ! ((dtDate.DayOfWeek == DayOfWeek.Sunday) || (Array.BinarySearch(arrDateFerie,dtDate) >= 0));
if (bolWorkingDay )
{
// Calcul du jour de pâques (algorithme de Oudin (1940))
//Calcul du nombre d'or - 1
int intGoldNumber = (int)(dtDate.Year % 19);
// Année divisé par cent
int intAnneeDiv100 = (int)(dtDate.Year /100);
// intEpacte est = 23 - Epacte (modulo 30)
int intEpacte = (int)((intAnneeDiv100 - intAnneeDiv100/4 - (8 * intAnneeDiv100 + 13)/25 +(
19 * intGoldNumber)+ 15) % 30);
//Le nombre de jours à partir du 21 mars pour atteindre la pleine lune Pascale
int intDaysEquinoxeToMoonFull = (int)(intEpacte - (intEpacte/28)*(1 - (intEpacte/28)*(29/(intEpacte + 1))*((21 - intGoldNumber)/11)));
//Jour de la semaine pour la pleine lune Pascale (0=dimanche)
int intWeekDayMoonFull = (int)((dtDate.Year + dtDate.Year/4 + intDaysEquinoxeToMoonFull +
2 - intAnneeDiv100 + intAnneeDiv100/4) % 7);
// Nombre de jours du 21 mars jusqu'au dimanche de ou
// avant la pleine lune Pascale (un nombre entre -6 et 28)
int intDaysEquinoxeBeforeFullMoon = intDaysEquinoxeToMoonFull - intWeekDayMoonFull;
// mois de pâques
int intMonthPaques =(int)( 3 + (intDaysEquinoxeBeforeFullMoon + 40)/44);
// jour de pâques
int intDayPaques = (int)(intDaysEquinoxeBeforeFullMoon + 28 - 31*(intMonthPaques / 4));
// lundi de pâques
DateTime dtMondayPaques = new DateTime(dtDate.Year,intMonthPaques,intDayPaques+1);
// Ascension
DateTime dtAscension = dtMondayPaques.AddDays(38);
//Pentecote
DateTime dtMondayPentecote = dtMondayPaques.AddDays(49);
bolWorkingDay=! ((DateTime.Compare(dtMondayPaques,dtDate)==0) || (DateTime.Compare(dtAscension,dtDate)==0)
|| (DateTime.Compare(dtMondayPentecote,dtDate)==0));
}
return bolWorkingDay;
}
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.