Calendrier perpétuel des jours fériés. [Résolu] - Divers - Programmation
Marsh Posté le 30-01-2014 à 11:21:05
c'est parceque c'est la misère à faire ( surtout le calcul lde paques ) : http://fr.wikipedia.org/wiki/Calcu [...] %C3%A2ques
Marsh Posté le 30-01-2014 à 11:43:26
Merci pour cette info! Je crois que je vais essayer de m'en servir pour justifier le fait que c'est impossible à faire, que ca risque de poser des problèmes.
Je vais lui proposer une maintenance qui consistera à déposer un csv des jours fériés chaque année, avec un événement généré si ce n'est pas fait.
Marsh Posté le 30-01-2014 à 11:46:25
Bonjour,
emacs le fait, dans le calendrier, mais c'est assez limité. . .
Vacances:
h : affiche tout jour férié connu pour cette date
x : affiche les jours fériés sur le calendrier
u : désactive l'affichage des jours fériés sur le calendrier
a : affiche les vacances des trois mois visibles dans un autre buffer
Voilà ce que "a" donne aujourd'hui:
Wednesday, 1 January 2014: Nouvel an
Friday, 31 January 2014: Chinese New Year (Jia-Wu)
Friday, 14 February 2014: St.Valentin
Wednesday, 5 March 2014: Ash Wednesday
Thursday, 20 March 2014: Vernal Equinox 5:56pm (CET)
Friday, 21 March 2014: Bahá'í New Year (Naw-Ruz) 171
Sunday, 30 March 2014: Daylight Saving Time Begins 2:00am (CET)
et pour les trois mois suivants:
Tuesday, 1 April 2014: 1° avril
Tuesday, 15 April 2014: Passover
Friday, 18 April 2014: Good Friday
Sunday, 20 April 2014: Easter Sunday
Monday, 21 April 2014: First Day of Ridvan
Tuesday, 29 April 2014: Ninth Day of Ridvan
Thursday, 1 May 2014: Fête du travail
Friday, 2 May 2014: Twelfth Day of Ridvan
Sunday, 11 May 2014: Fête des mères
Friday, 23 May 2014: Declaration of the Bab
Thursday, 29 May 2014: Ascension of Baha'u'llah
Wednesday, 4 June 2014: Shavuot
Sunday, 15 June 2014: Fête des pères
Saturday, 21 June 2014: Summer Solstice 12:51pm (CEST)
Sunday, 29 June 2014: Ramadan Begins
Le jour de Pâques n'apparaît pas. . .
Marsh Posté le 30-01-2014 à 11:46:42
Impossible ,non,
Mais que ça va lui coûter plusieurs jours de développement et tests, au lieu de lui prendre 10 minutes par an
Marsh Posté le 30-01-2014 à 12:02:26
Impossible, peut être pas. Le risque étant :
- Si le calendrier déclare un jour férié alors que s'en est pas un : le dispositif HNO s'activera, et donc le client sera facturé pour la supervision alors qu'il n'en n'aura pas besoin, vu que ces équipes d'exploit seront au taf. ce risque est faible, mais peut se produire en cas de changement législatif par exemple, surtout par les temps qui courent : ex. pentecote.
- Si le calendrier oublie un jour férié, la supervision HNO ne se déclanchera pas. En cas de merde d'un équipement, le client risque d'avoir des clients mécontants. Le risque est plus élevé que pour le premier cas à mon avis.
Sinon, merci pour l'astuce emacs, je vais regarder comment ça fonctionne!
Marsh Posté le 30-01-2014 à 12:09:50
Effectivement, ça n'a pas l'air simple : http://fr.wikipedia.org/wiki/F%C3% [...] _en_France
Marsh Posté le 30-01-2014 à 12:13:02
Pas moyen d'utiliser le calendar des jours fériés fourni par google ?
https://www.google.com/calendar/fee [...] blic/basic
Mais impossible de ne prévoir aucune maintenance, quelque soit la solution choisie
Marsh Posté le 31-01-2014 à 09:14:42
Bonjour,
Pour un début de piste,
Un VbScript (à enregistrer avec l'extension .vbs) :
' *******************************************************************
' Calcul du nombre de jours ouvrés entre deux dates
' compte tenu des jours fériés fixes et mobiles
' 19/06/2002
' *******************************************************************
Do while true
NbJours=0
NbSamedis=0
NbDimanches=0
NbFeries=0
NbOuvres = 0
Debut = InputBox("Entrer la date de début (jj/mm/aaaa)", "Mes vacances !", "" )
if Debut = "" then
WScript.Quit()
elseif not IsDate(Debut) then
Resultat = MsgBox ("La date de début est invalide.", vbCritical, "Mes vacances !" )
OK = false
end if
Fin = InputBox("Entrer la date de fin (jj/mm/aaaa)", "Mes vacances !", "" )
if Fin = "" then
WScript.Quit()
elseif not IsDate(Fin) then
Resultat = MsgBox ("La date de fin est invalide.", vbCritical, "Mes vacances !" )
OK = false
end if
OK = true
if OK = true then
Deb = Debut
Do while DateDiff("d", Deb, Fin) >= 0
if WeekDay(Deb, vbMonday) = 6 then
NbSamedis = NbSamedis + 1
elseif WeekDay(Deb, vbMonday) = 7 then
NbDimanches = Nbdimanches + 1
elseif IsFerie(Deb) then 'and WeekDay(Deb, vbMonday) <> 6 and WeekDay(Deb, vbMonday) <> 7 then
NbFeries = NbFeries + 1
end if
NbJours=NbJours+1
Deb = DateAdd("d", 1, Deb)
Loop
end if
NbOuvres = NbJours - NbFeries - NbSamedis - NbDimanches
Resultat = MsgBox ("La période du " & Debut & " au " & Fin & " comprend " & NbOuvres _
& " jours ouvrés." & chr(10) & chr(10) & "(Les éventuels ponts ne sont pas pris en compte.)" _
& vbcrlf & "Samedis = " & NbSamedis & vbcrlf & "Dimanches = " & NbDimanches, vbInformation, "Mes vacances !" )
loop
Function IsFerie(LeJour)
Annee = Year(LeJour)
Paques = fPaques(Annee) 'Cherche le jour de Pâques
LunPaq = cStr(DateAdd("d", 1, Paques)) 'En déduit les jours fériés mobiles
Ascension = cStr(DateAdd("d", 39, Paques))
LunPent = cStr(DateAdd("d", 50, Paques))
PremierJanvier = "01/01/" & Annee
PremierMai = "01/05/" & Annee
HuitMai = "08/05/" & Annee
QuatorzeJuillet = "14/07/" & Annee
QuinzeAout = "15/08/" & Annee
PremierNovembre = "01/11/" & Annee
OnzeNovembre = "11/11/" & Annee
Noel = "25/12/" & Annee
StrJour = cStr(LeJour)
if StrJour = LunPaq or StrJour = Ascension or (StrJour = LunPent and Year(LunPent) < 2005) _
or StrJour = PremierJanvier or StrJour = PremierMai or StrJour = HuitMai _
or StrJour = QuatorzeJuillet or StrJour = QuinzeAout or StrJour = OnzeNovembre _
or StrJour = PremierNovembre or StrJour = Noel then
IsFerie = true
else
IsFerie = false
end if
End Function
Function fPaques(An)
'Calcule le jour de Pâques en fonction de l'année
a = An Mod 19
b = An \ 100
c = An Mod 100
d = b \ 4
e = b Mod 4
f = (b + 8) \ 25
g = (b - f + 1) \ 3
h = (19 * a + b - d - g + 15) Mod 30
i = c \ 4
k = c Mod 4
l = (32 + 2 * e + 2 * i - h - k ) Mod 7
m = (a + 11 * h + 22 * l ) \ 451
n = (h + l - 7 * m + 114) \ 31
p = (h + l - 7 * m + 114) Mod 31
fPaques = DateSerial(An , n , p + 1)
End Function
Marsh Posté le 31-01-2014 à 10:27:35
Dans mon soft Astres (cf ma signature), dans /Astres/Common/DateTimeLibrary.php, tu trouveras plusieurs fonctions qui devraient t'aider :
jours_ouvres($mois, $an)
ferie($mois, $an)
jour_ferie($date)
Je les utilise depuis 2004, pas eu de pb pour l'instant, sauf avec la Pentecôte où là, les décisions du gouvernement ont tellement changé que j'ai désactivé ce jour comme férié.
Marsh Posté le 31-01-2014 à 11:32:32
Ok, merci, vous etes super les gars .pc75, merci d'avoir fait l'effort de copier le script, les calculs du jour de paques vont bine m'aider.
Idem Rufo, ainsi que ton retour d'expérience. Je vais regarder ton script et m'en inspirer. Je les ferai probablement en Perl.
Je vous tient au courant.
Marsh Posté le 31-01-2014 à 12:12:55
guimo33 a écrit : Pour l'instant j'ai cherché : |
Ben une recherche sur "CPAN Hollidays" m'a renvoyé sur Date::Holidays qui a l'air de faire le boulot.
Un truc codé à l'arrache (c'est l'heure de bouffer) pour tester:
Code :
|
E:\Gilou>perl holi.pl |
Ça ne liste que les jours fériés ne tombant pas un samedi ou dimanche mais ça devrait te convenir.
EDIT: plus court et rapide:
Code :
|
(et vu l'implémentation du module, pas de souci avec les dates fausses passées par la double boucle)
ce qui donne en sortie:
01/01/2014: Nouvel an |
De plus le source de Date::Holidays::FR est court et facilement modifiable pour adapter à ses besoins (par exemple Pentecôte). Au vu du code, il retourne les jours fériés qu'ils soient des dimanches ou pas, sauf ceux dont il sait déjà que ce sont des dimanches, ie Pâques)
(et si ce que tu cherches en fait, c'est les business days, tu peux facilement récupérer la sortie de ce programme, pour faire un sub holiday compatible avec le module Date::Business, en filtrant les jours qui tombent un samedi ou dimanche de la liste des 11)
A+,
Marsh Posté le 31-01-2014 à 14:50:17
Trop fort, merci!
Pour info, j'ai aussi trouvé une CPAN Date::Easter http://search.cpan.org/~rbow/Date- [...] /Easter.pm qui fait la détermination du jour de paques.
En fait, des que j'ai su qu'il fallait chercher "easter" ou "holliday", ça m'a ouvert pas mal de résultats
Donc je vais utiliser soit :
- easter cpan + script inspiré du calendrier de gestion des cantines de Rufo
- directement holidays, mais après vérif qu'il n'y a pas de problème avec les jours fériés (pentecote etc...).
Je met [résolu] dans le titre, en épérant pouvoir en aider d'autres de la même manière (je le fais déja dans discussions et audio lol).
Marsh Posté le 31-01-2014 à 15:45:57
Si tu regardes le code de Date::Holidays::FR, tu verras que sur les 11 jours fériés pour la France qu'il calcule, ils sont tous à date fixe, sauf Pâques (qu'il intègre pas dans sa liste, car c'est défini officiellement avec les 11), le Lundi de Pâques (Donc Pâques+1), Le Jeudi de l'Ascension (Pâques + 39) et le Lundi de Pentecôte (Pâques + 50).
Donc en fait, il connait les 8 dates fixes, il calcule Pâques en faisant appel justement a Date::Easter, et à partir de la, il calcule les 3 dates mobiles restantes. C'est pratiquement à ça que se réduit le code de Date::Holidays::FR dans http://cpansearch.perl.org/src/FAB [...] days/FR.pm
Donc si par exemple tu veux la liste des jours fériés ne tombant pas un samedi ou dimanche, tu as déjà les 3 dates mobiles, et il te reste à éliminer parmi les 8 restantes celles tombant un samedi ou dimanche (cette année, la Toussaint tombe un Samedi). Par exemple ainsi on peut ainsi coder une version nettement plus réaliste des jours de congé français... :
Code :
|
01/01/2014: Nouvel an |
A+,
Marsh Posté le 19-01-2016 à 17:05:24
Bonjour,
Meilleur vœux pour 2016
Ce petit message et déterrage pour remercier pc75
Je me suis servi de son code adapté en VB.NET et il fonctionne très bien
Merci mille fois!
Marsh Posté le 30-01-2014 à 11:08:03
bonjour,
Dans le cadre de la supervision de mon client, je souhaite intégrer un calendrier perpétuel. Ce qui est important dans mon cas, c'est uniquement de connaitre les jours fériés pour la France : la supervision ne sera active qu'en HNO et jours fériés + samedi/dimanche.
Le client ne souhaite pas avoir de maintenance de ce calendrier (bin tient!), et donc me demande la solution la plus automatisée possible. (Je ne fais que l'étude et la réal, pas l'exploitation)
Quelqu'un a t il été déja confronté à ce problème? Des idées?
Pour l'instant j'ai cherché :
- CPAN : aucune bibli ne permet de faire ça
- Export des jours fériés Outlook sur plusieurs années : semble alambiqué
- Site web qui propose un export accessible avec une commande genre wget : j'ai pas trouvé
- Script de génération de calendriers : pas trouvé de fiable
Des idées?
Message édité par guimo33 le 31-01-2014 à 14:54:44