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




 
 





 
  