Jours fériés et dimanche

Soyez le premier à donner votre avis sur cette source.

Snippet vu 31 282 fois - Téléchargée 33 fois

Contenu du snippet

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;
}

A voir également

Ajouter un commentaire

Commentaires

Messages postés
302
Date d'inscription
vendredi 20 février 2009
Statut
Membre
Dernière intervention
29 juillet 2020

Passer en paramètre DateTime.ToDay plutôt que DateTime.Now.

OK je sors ...
Messages postés
13
Date d'inscription
lundi 15 octobre 2007
Statut
Membre
Dernière intervention
26 décembre 2010

Merci pour cette source, ça m'a évité de tout me retaper moi-même :-)
D'après mon VDD, le code plante pour Pâques 2013... Et ce que je développe sera obsolète à cette date, donc pas bien grave.
J'ai adapté le return pour mon programme, sinon tout est ok
Messages postés
2
Date d'inscription
lundi 9 février 2004
Statut
Membre
Dernière intervention
9 décembre 2009

plantage en 2013 pour le lundi de pâques :
DateTime dtMondayPaques = new DateTime(dtDate.Year,intMonthPaques,intDayPaques+1);
à remplacer par :
DateTime dtMondayPaques = new DateTime(dtDate.Year, intMonthPaques, intDayPaques).AddDays(1);

sinon super code...
Messages postés
1
Date d'inscription
mardi 12 avril 2005
Statut
Membre
Dernière intervention
30 juillet 2008

Bonjour,

J'essai d'utiliser le calcul des jours fériés et j'ai un pb avec le Lundi de Paques.
La variable "intDayPaques" est à -8, du coup la ligne Dim dtMondayPaques As New DateTime(dtDate.Year, intMonthPaques, Math.Abs(intDayPaques) - 1) plante.

Quelqu'un a t-il une idée svp.
Merci
Messages postés
72
Date d'inscription
jeudi 30 novembre 2000
Statut
Membre
Dernière intervention
10 novembre 2008

J'ai fait une traduction en VB.net mais il me trouve paque le 08/04/2007 au lieu du 09/04/2007. Ce qui me décale tout le reste...
Vous voyer d'ou ça peut venir ?

Public Function IsWorkingDay(ByVal dtDate As DateTime) As Boolean
Dim bolWorkingDay As Boolean = True
Dim arrDateFerie As Array
arrDateFerie = Array.CreateInstance(GetType(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é
If (dtDate.DayOfWeek = DayOfWeek.Sunday) Or Array.BinarySearch(arrDateFerie, dtDate) >= 0 Then bolWorkingDay = False

If bolWorkingDay Then
' Calcul du jour de pâques (algorithme de Oudin (1940))
'Calcul du nombre d'or - 1
Dim intGoldNumber As Integer = CInt(dtDate.Year Mod 19)
' Année divisé par cent
Dim intAnneeDiv100 As Integer = CInt(dtDate.Year / 100)
' intEpacte est = 23 - Epacte (modulo 30)
Dim intEpacte = CInt((intAnneeDiv100 - intAnneeDiv100 / 4 - (8 * intAnneeDiv100 + 13) / 25 + (19 * intGoldNumber) + 15) Mod 30)
'Le nombre de jours à partir du 21 mars pour atteindre la pleine lune Pascale
Dim intDaysEquinoxeToMoonFull As Integer = CInt((intEpacte - (intEpacte / 28) * (1 - (intEpacte / 28) * (29 / (intEpacte + 1)) * ((21 - intGoldNumber) / 11))))
'Jour de la semaine pour la pleine lune Pascale (0=dimanche)
Dim intWeekDayMoonFull As Integer = CInt(((dtDate.Year + dtDate.Year / 4 + intDaysEquinoxeToMoonFull + 2 - intAnneeDiv100 + intAnneeDiv100 / 4) Mod 7))
' Nombre de jours du 21 mars jusqu'au dimanche de ou
' avant la pleine lune Pascale (un nombre entre -6 et 28)
Dim intDaysEquinoxeBeforeFullMoon As Integer = intDaysEquinoxeToMoonFull - intWeekDayMoonFull
' mois de pâques
Dim intMonthPaques As Integer = CInt(3 + (intDaysEquinoxeBeforeFullMoon + 40) / 44)
' jour de pâques
Dim intDayPaques As Integer = CInt(intDaysEquinoxeBeforeFullMoon + 28 - 31 * (intMonthPaques / 4))
' lundi de pâques
Dim dtMondayPaques As DateTime = New DateTime(dtDate.Year, intMonthPaques, intDayPaques + 1)
' Ascension
Dim dtAscension As DateTime = dtMondayPaques.AddDays(38)
'Pentecote
Dim dtMondayPentecote As DateTime = dtMondayPaques.AddDays(49)
If (DateTime.Compare(dtMondayPaques, dtDate) 0) Or (DateTime.Compare(dtAscension, dtDate) 0) Or (DateTime.Compare(dtMondayPentecote, dtDate) = 0) Then
bolWorkingDay = False
Else
bolWorkingDay = True
End If

End If

Return bolWorkingDay

End Function
Afficher les 8 commentaires

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.