Voila une petite adaptation de certain code pour la gestion des dates. (peu être un petit problème au niveau du comptage des jours ouvrables), aucun site que j'ai regardé ne donne les mêmes information.
Code : Tout sélectionner
DisableASM
EnableExplicit
; ****************************************************************************
DeclareModule toDate
Enumeration cDayCount
#NoOption = 0
#NoWeekDay = 1
#BusinessDay = 2
#NoWorkingDay = 3
#PublicHoliday = 4
EndEnumeration
Enumeration cDayOfWeek
#Sunday = 0
#Monday = 1
#Tuesday = 2
#Wednesday = 3
#Thursday = 4
#Friday = 5
#Saturday = 6
EndEnumeration
Declare.i DayofDate (DateDebut.s, DateFin.s, option.l = #NoOption, DayOff.l = #Sunday)
Declare.b IsBisextile (year.i)
Declare.i ToDayInMonth (month.i, year.i)
Declare.b IsEndOfMonth ()
Declare.b IsPublicHoliday (date.s)
EndDeclareModule
Module toDate
DisableASM
EnableExplicit
; ****************************************************************************
; Permet de savoir si une date est valide ou non.
;
; @author GallyHomeCorp
; @param Date
; @return
Procedure.b IsValidDate(Date.s)
Date = FormatDate("%dd/%mm/%yyyy", ParseDate("%dd/%mm/%yyyy", Date))
If ParseDate("%dd/%mm/%yyyy", Date) > 0
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
; Donne le nombre de jour entre deux dates (Total, Ouvré, Ouvrable).
;
; @author GallyHomeCorp
; @param DateDebut (dd/MM/yyyy)
; @param DateFin (dd/MM/yyyy)
; @param option
; @param DayOff
; @return
Procedure.i DayofDate(DateDebut.s, DateFin.s, option.l = #NoOption, DayOff.l = #Sunday)
Define.i number, count, iDate, samedi
Define.s sDate
If IsValidDate(DateDebut) = #False Or IsValidDate(DateFin) = #False
ProcedureReturn -1
EndIf
If ParseDate("%dd/%mm/%yyyy", DateDebut) > ParseDate("%dd/%mm/%yyyy", DateFin)
Define.s tmpDate = DateDebut
DateDebut = DateFin
DateFin = tmpDate
EndIf
Repeat
sDate = FormatDate("%dd/%mm/%yyyy", AddDate(ParseDate("%dd/%mm/%yyyy", DateDebut), #PB_Date_Day, count))
iDate = DayOfWeek(AddDate(ParseDate("%dd/%mm/%yyyy", DateDebut), #PB_Date_Day, count))
number + 1
If option <> #NoOption
If option <> #PublicHoliday
If option = #NoWorkingDay
If iDate = DayOff Or IsPublicHoliday(sDate)
number - 1
EndIf
Else
If option <> #NoOption
If ((option = #NoWeekDay Or option = #BusinessDay) And (iDate = #Sunday Or iDate = #Saturday)) Or (option = #BusinessDay And IsPublicHoliday(sDate) And (iDate <> #Sunday Or iDate <> #Saturday))
number - 1
EndIf
EndIf
EndIf
Else
If IsPublicHoliday(sDate) = 0
number - 1
EndIf
EndIf
EndIf
count + 1
Until sDate = DateFin
ProcedureReturn number
EndProcedure
; ****************************************************************************
; Indique si une année est Bixextile (mois de Février).
;
; @author GallyHomeCorp
; @param text (yyyy)
; @return
Procedure.b IsBisextile(year.i)
ProcedureReturn Bool((year % 4) = 0 And (year % 100) > 0 Or (year % 400))
EndProcedure
; Indique si une date est un jour férié ou non.
;
; @author GallyHomeCorp
; @param date (dd/MM/yyyy)
; @return
Procedure.b IsPublicHoliday(date.s)
Define.i easter
Define.s easterDay
Define.s publicHoliday = "01/01,01/05,08/05,14/07,15/08,01/11,11/11,25/12"
Define.b pHoliday = Bool(CountString(publicHoliday, Mid(date, 1, 5)) > 0)
If Not pHoliday
Define.i tmp = 0, dom = 0, pfm = 0 , year = Val(Mid(date, 7))
;If (year + (year / 4) - (year / 100) + (year / 400)) % 7 < 0
; dom = ((year + (year / 4) - (year / 100) + (year / 400)) % 7) + 7
;Else
dom = (year + (year / 4) - (year / 100) + (year / 400)) % 7
;EndIf
If ((3 - (11 * ((year % 19) + 1)) + ((year - 1600) / 100 - (year - 1600) / 400) - ((((year - 1400) / 100) * 8) / 25)) % 30) < 0
pfm = ((3 - (11 * ((year % 19) + 1)) + ((year - 1600) / 100 - (year - 1600) / 400) - ((((year - 1400) / 100) * 8) / 25)) % 30) + 30
Else
pfm = ((3 - (11 * ((year % 19) + 1)) + (year - 1600) / 100 - (year - 1600) / 400) - ((((year - 1400) / 100) * 8) / 25)) % 30
EndIf
If pfm = 29 Or (pfm = 28 And ((year % 19) + 1) > 11)
pfm-1
EndIf
;If (4 - pfm - dom) % 7 < 0
; tmp = ((4 - pfm - dom) % 7) + 7
;Else
tmp = (4 - pfm - dom) % 7
;EndIf
easter = pfm + tmp + 1
If easter < 11
easterDay = Str(easter + 21) + "/03/" + Str(year)
Else
easterDay = Str(easter - 10) + "/04/" + Str(year)
EndIf
Define.s publicPaques = FormatDate("%dd/%mm", AddDate(ParseDate("%dd/%mm/%yyyy", easterDay), #PB_Date_Day, 1)) + "," + FormatDate("%dd/%mm", AddDate(ParseDate("%dd/%mm/%yyyy", easterDay), #PB_Date_Day, 39)) + "," + FormatDate("%dd/%mm", AddDate(ParseDate("%dd/%mm/%yyyy", easterDay), #PB_Date_Day, 50))
pHoliday = Bool(CountString(publicPaques, Mid(date, 1, 5)) > 0)
EndIf
ProcedureReturn pHoliday
EndProcedure
; ****************************************************************************
; Indique si le jour en cours et le dernier du mois.
;
; @author GallyHomeCorp
; @return
Procedure.b IsEndOfMonth()
If ToDayInMonth(Month(Date()), Year(Date())) = Day(Date())
ProcedureReturn #True
EndIf
ProcedureReturn #False
EndProcedure
; Nombre de jour dans un Mois en fontion du Mois/Année.
;
; @author GallyHomeCorp
; @param month (DD)
; @param year (yyyy)
; @return
Procedure.i ToDayInMonth(month.i, year.i)
If month = 2
If IsBisextile(year)
ProcedureReturn 29
Else
ProcedureReturn 28
EndIf
Else
If month = 4 Or month = 6 Or month = 9 Or month = 11
ProcedureReturn 30
Else
ProcedureReturn 31
EndIf
EndIf
EndProcedure
EndModule
; ****************************************************************************
Debug Str(toDate::DayofDate("01/02/2021", "31/02/2021", toDate::#NoOption)) + " jour(s) Total (vérification de la date)"
Debug "----------------"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#NoOption)) + " jour(s) Total"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#NoWeekDay)) + " jour(s) hors WE"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#BusinessDay)) + " jour(s) Ouvré(s)"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#NoWorkingDay)) + " jour(s) Ouvrable(s)"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#PublicHoliday)) + " jour(s) Férié(s)"
Debug Str(toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#NoWeekDay) - toDate::DayofDate("01/01/2021", "31/01/2021", toDate::#BusinessDay)) + " Jour(s) Férié(s) hors WE"
; Debug "----------------"
; Debug Str(toDate::DayofDate("05/03/1974", "04/02/2021", toDate::#BusinessDay))
; Debug "----------------"
; Debug "2016 = " + toDate::IsBisextile (2016)
; Debug "2017 = " + toDate::IsBisextile (2017)
; Debug "2018 = " + toDate::IsBisextile (2018)
; Debug "2019 = " + toDate::IsBisextile (2019)
; Debug "2020 = " + toDate::IsBisextile (2020)
; Debug "2020 = " + toDate::IsBisextile (2021)
;
; Debug toDate::ToDayInMonth(2, 2016)
;
; Debug "Dernier jour du mois ? " + toDate::IsEndOfMonth()
;
; Debug "Jour férié ? " + toDate::IsPublicHoliday(FormatDate("%dd/%mm/%yyyy", Date()))
Cordialement,
GallyHC