64 lignes de code qui permettent de savoir si une date donnée tombe un jour férié (y compris les fêtes mobiles comme le lundi de Pâques, le Lundi de Pentecôte ou le jeudi de l'Ascension).
Pour des besoins professionnels, il y a plus de 20 ans, (j'en ai 66), je devais calculer la disponibilité de Services Bancaires et j'avais besoin de connaître les jours fériés (y compris mobiles). Il y avait bien sûr la possibilité de mettre ces dates en "dur" dans des paramètres mais je souhaitais une solution automatique ce qui éviterait les erreurs si on oubliait de mettre à jour ces dates manuellement.
En fouillant sur Internet (c'était presque le début), j'avais trouvé une formule mise au point par des moines, de ce que je me souviens. J'avais adapté la formule à VBA (que j'utilisais à l'époque).
Ci-dessous, voici le code en Purebasic. Bien sûr, ce code peut-être adapté pour qu'il corresponde à votre besoin (par exemple, boucler sur une année pour rechercher tous les jours fériés).
Cordialement,
Jacques Joly
Code : Tout sélectionner
EnableExplicit
Global Dim t_jours.s(16)
Global j.b
Procedure.b jour_ferie(jour.w,mois.w,annee.w)
Protected A.w,T.i,LP.i,LD.i,retour.b
If Date(annee,mois,jour,0,0,0)=-1
MessageRequester("Erreur","La date passée en paramètre n'est pas une date valide")
ProcedureReturn -1
EndIf
;=---------- La date passée en paramètre est valide
A=annee
LD=Int(Date(annee,mois,jour,0,0,0))/86400+25569
;=---------- Formule mise au point par des moines
T=Mod(255-11*Mod(A,19)-21,30)+21
LP=Date(A,3,2,0,0,0)/86400+25569+T+Bool(T>48)+6-Mod((A+Int(A/4)+T+Bool(T>48)+1),7)
;=---------- Interprétation du résultat
If LD=LP : retour=7 ; Lundi de Pâques
ElseIf LD=LP+38 : retour=8 ; Jeudi de l'Ascension
ElseIf LD=LP+49 : retour=9 ; Lundi de Pentecôte
ElseIf jour=1 And mois=1 : retour=10 ; Jour de l'an
ElseIf jour=1 And mois=5 : retour=11 ; 1er mai
ElseIf jour=8 And mois=5 : retour=12 ; 8 mai
ElseIf jour=14 And mois=7 : retour=13 ; 14 juillet
ElseIf jour=15 And mois=8 : retour=14 ; 15 août
ElseIf jour=1 And mois=11 : retour=15 ; 1er novembre
ElseIf jour=11 And mois=11 : retour=16 ; 11 novembre
ElseIf jour=25 And mois=12 : retour=17 ; Noël
Else
retour=DayOfWeek(Date(annee,mois,jour,0,0,0)) ; 0=dimanche, lundi=1, mardi=2.....
EndIf
ProcedureReturn retour
EndProcedure
;=---------- Charger les jours dans le tableau
Restore jours_feries
For j=0 To 16
Read.s t_jours(j)
Next j
;=---------- Test fonction
Debug t_jours(jour_ferie(18,4,2022)) ; jour,mois,année
DataSection
jours_feries:
Data.s "Dimanche"
Data.s "Lundi"
Data.s "Mardi"
Data.s "Mercredi"
Data.s "Jeudi"
Data.s "Vendredi"
Data.s "Samedi"
Data.s "Lundi de Pâques"
Data.s "Jeudi de l'Ascension"
Data.s "Lundi de Pentecôte"
Data.s "Jour de l'an"
Data.s "1er mai"
Data.s "8 mai"
Data.s "14 juillet"
Data.s "15 août"
Data.s "1er novembre"
Data.s "11 novembre"
Data.s "Noël"
EndDataSection