Date2 par Micoute

Programmation d'applications complexes
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Date2 par Micoute

Message par Micoute »

Bonjour à tous,
j'avais envie d'ajouter des fonctions sur les dates à PureBasic, PB pour les intimes et je vous les offre.

Code : Tout sélectionner

;Date2.pbi
;Conçu et réailisé par micoute
;Le 15 juin 2025
;Avec PB 6.21 (x64)
;{ Structure
Structure sDiffTemps 
  TotalJours.q
  JoursRestants.q 
  Annees.q 
  Mois.q 
  Heures.q
  Minutes.q 
  Secondes.q
  
  sTotalJours.s
  sJoursRestants.s
  sAnnees.s
  sMois.s
  sHeures.s
  sMinutes.s
  sSecondes.s
EndStructure

Structure Temps
  Annee.w
  Mois.w
  JourDeSemaine.w
  Jour.w
  Heure.w
  Minute.w
  Seconde.w
  Milliseconde.w
EndStructure

Structure sFetes
  Index.i
  Fete.s
  Date.s
EndStructure  
;}
;{ Constantes
#SecsParJourQ = 86400
#UniteTemps = "an|s,mois,jour|s,heure|s,minute|s,seconde|s"
;}
;{ Variables
Global UniteDateQ.q = 10000000 ; Unité de granularité, initialement 1 seconde pour la compatibilité avec les routines date de PB 4.xx
Global UniteJourQ.q = 86400    ; Nombre de granularité unités par jour
Global MaDiff.sDiffTemps
Global NewMap Fetes_Journalieres.sFetes()
;}
;{ Section de données
DataSection
  fetes:
  Data.s "Jour de l'an","01/01", "Basile","02/01","Geneviève","03/01","Odilon","04/01","Edouard","05/01","Mélaine","06/01"
  Data.s "Raymond","07/01","Lucien","08/01","Alix","09/01","Guillaume","10/01","Pauline","11/01"
  Data.s "Tatiana","12/01","Yvette","13/01","Nina","14/01","Rémi","15/01","Marcel","16/01"
  Data.s "Roseline","17/01","Prisca","18/01","Marius","19/01","Sébastien","20/01","Agnès","21/01"
  Data.s "Vincent","22/01","Barnard","23/01","François de Sales","24/01","Conversion de Paul","25/01"
  Data.s "Paule","26/01","Angèle","27/01","Thomas d'Aquin","28/01","Gildas","29/01","Martine","30/01"
  Data.s "Marcelle","31/01","Ella","01/02","Présentation","02/02","Blaise","03/02","Véronique","04/02"
  Data.s "Agathe","05/02","Gaston","06/02","Eugènie","07/02","Jacqueline","08/02","Apolline","09/02"
  Data.s "Arnaud","10/02","Notre Dame de Lourdes","11/02","Félix","12/02","Béatrice","13/02"
  Data.s "Valentin","14/02","Claude","15/02","Julienne","16/02","Alexis","17/02","Bernadette","18/02"
  Data.s "Gabin","19/02","Aimée","20/02","Damien","21/02","Isabelle","22/02","Lazare","23/02"
  Data.s "Modeste","24/02","Roméo","25/02","Nestor","26/02","Honorine","27/02","Romain","28/02"
  Data.s "Aubin","01/03","Charles le Bon","02/03","Guénolé","03/03","Casimir","04/03","Olive","05/03"
  Data.s "Colette","06/03","Félicité","07/03","Jean de Dieu","08/03","Françoise","09/03","Vivien","10/03"
  Data.s "Rosine","11/03","Justine","12/03","Rodrigue","13/03","Mathilde","14/03","Louise","15/03"
  Data.s "Bénédicte","16/03","Patrice","17/03","Cyrille","18/03","Joseph","19/03","Anatole","20/03"
  Data.s "Clémence","21/03","Léa","22/03","Victorien","23/03","Catherine","24/03","Annonciation","25/03"
  Data.s "Larissa","26/03","Habib","27/03","Gontran","28/03","Gwladys","29/03","Amédée","30/03"
  Data.s "Benjamin","31/03","Hugues","01/04","Sandrine","02/04","Richard","03/04","Isidore","04/04"
  Data.s "Irène","05/04","Marcellin","06/04","Jean-Baptiste de la Salle","07/04","Julie","08/04"
  Data.s "Gautier","09/04","Fulbert","10/04","Stanislas","11/04","Jules","12/04","Ida","13/04"
  Data.s "Maxime","14/04","Paterne","15/04","Benoît-Joseph","16/04","Anicet","17/04","Parfait","18/04"
  Data.s "Emma","19/04","Odette","20/04","Anselme","21/04","Alexandre","22/04","Georges","23/04"
  Data.s "Fidèle","24/04","Marc","25/04","Alida","26/04","Zita","27/04","Valérie","28/04"
  Data.s "Catherine de Sienne","29/04","Robert","30/04","Fête du travail", "01/05","Boris","02/05","Philippe / Jacques","03/05"
  Data.s "Sylvain","04/05","Judith","05/05","Prudence","06/05","Gisèle","07/05","Jeanne d'Arc","08/05","Pacôme","09/05"
  Data.s "Solange","10/05","Estelle","11/05","Achille","12/05","Rolande","13/05","Matthias","14/05"
  Data.s "Denise","15/05","Honoré","16/05","Pascal","17/05","Eric","18/05","Yves","19/05"
  Data.s "Bernardin","20/05","Constantin","21/05","Emile","22/05","Didier","23/05","Donatien","24/05"
  Data.s "Sophie","25/05","Bérenger","26/05","Augustin","27/05","Germain","28/05","Aymar","29/05"
  Data.s "Ferdinand","30/05","Visitation de la Sainte Vierge","31/05","Justin","01/06","Blandine","02/06"
  Data.s "Kévin","03/06","Clotilde","04/06","Igor","05/06","Norbert","06/06","Gilbert","07/06"
  Data.s "Médard","08/06","Diane","09/06","Landry","10/06","Barnabé","11/06","Guy","12/06"
  Data.s "Antoine de Padoue","13/06","Elisée","14/06","Germaine","15/06","Jean-François et Régis","16/06"
  Data.s "Hervé","17/06","Léonce","18/06","Romuald","19/06","Silvère","20/06","Héraclide et Rodolphe","21/06"
  Data.s "Alban","22/06","Audrey","23/06","Jean-Baptiste","24/06","Prosper","25/06","Anthelme","26/06"
  Data.s "Fernand","27/06","Irénée","28/06","Pierre et Paul","29/06","Martial","30/06","Thierry","01/07"
  Data.s "Martinien","02/07","Thomas","03/07","Florent","04/07","Antoine","05/07","Mariette","06/07"
  Data.s "Raoul","07/07","Kylie et Thibault","08/07","Amandine","09/07","Ulrich","10/07","Benoît","11/07"
  Data.s "Olivier","12/07","Henri et Joël","13/07","Fête nationale","14/07","Donald","15/07","Notre Dame du Mont Carmel","16/07"
  Data.s "Charlotte","17/07","Frédéric","18/07","Arsène","19/07","Marina","20/07","Victor","21/07"
  Data.s "Marie-Madeleine","22/07","Brigitte","23/07","Christine","24/07","Jacques","25/07"
  Data.s "Anne et Joachin","26/07","Nathalie","27/07","Samson","28/07","Marthe","29/07","Juliette","30/07"
  Data.s "Ignace de Loyola","31/07","Alphonse","01/08","Julien et Eymard","02/08","Lydie","03/08"
  Data.s "Jean-Marie Vianney","04/08","Abel","05/08","Transfiguration","06/08","Gaétan","07/08"
  Data.s "Dominique","08/08","Amour","09/08","Laurent","10/08","Claire","11/08","Clarisse","12/08"
  Data.s "Hippolyte","13/08","Evrard","14/08","Assomption","15/08","Armel","16/08","Hyacinthe","17/08","Hélène","18/08"
  Data.s "Jean-Eudes","19/08","Bernard","20/08","Christophe","21/08","Fabrice","22/08"
  Data.s "Rose de Lima","23/08","Barthélémy","24/08","Louis","25/08","Natacha","26/08","Monique","27/08"
  Data.s "Augustin","28/08","Sabine","29/08","Fiacre","30/08","Aristide","31/08","Gilles","01/09"
  Data.s "Ingrid","02/09","Grégoire","03/09","Rosalie","04/09","Raïssa","05/09","Bertrand","06/09"
  Data.s "Reine","07/09","Nativité","08/09","Alain","09/09","Inès","10/09","Adelphe","11/09"
  Data.s "Apollinaire","12/09","Aimé","13/09","Croix Glorieuse","14/09","Roland","15/09","Edith","16/09"
  Data.s "Renaud","17/09","Nadège","18/09","Emilie","19/09","Davy","20/09","Matthieu","21/09"
  Data.s "Maurice","22/09","Constant", "23/09","Thècle","24/09","Hermann","25/09","Côme et Damien","26/09"
  Data.s "Vincent de Paul","27/09","Venceslas","28/09","Michel, Gabriel et Raphaël","29/09"
  Data.s "Jérôme","30/09","Thérèse de l' Enfant Jésus","01/10","Léger","02/10","Gérard","03/10"
  Data.s "François d'Assise","04/10","Fleur","05/10","Bruno","06/10","Serge","07/10","Pélagie","08/10"
  Data.s "Denis","09/10","Ghislain","10/10","Firmin","11/10","Wilfried","12/10","Géraud","13/10"
  Data.s "Juste","14/10","Thérèse d'Avila","15/10","Edwige","16/10","Baudoin","17/10","Luc","18/10"
  Data.s "René","19/10","Adeline","20/10","Céline","21/10","Elodie","22/10","Jean de Capistran","23/10"
  Data.s "Florentin","24/10","Crépin","25/10","Dimitri","26/10","Emeline","27/10","Jude","28/10"
  Data.s "Narcisse","29/10","Bienvenu","30/10","Quentin","31/10","Toussaint","01/11","Défunts","02/11"
  Data.s "Hubert","03/11","Charles","04/11","Sylvie","05/11","Bertille","06/11","Carine","07/11"
  Data.s "Geoffroy","08/11","Théodore","09/11","Léon","10/11","Armistice 14-18","11/11","Christian","12/11","Brice","13/11"
  Data.s "Sidoine","14/11","Albert","15/11","Marguerite","16/11","Elisabeth","17/11","Aude","18/11"
  Data.s "Tanguy","19/11","Edmond","20/11","Christ Roi et Prés de Marie", "21/11","Cécile","22/11"
  Data.s "Clément","23/11","Flora","24/11","Catherine","25/11","Delphine","26/11","Sévrin","27/11"
  Data.s "Jacques de la Marche","28/11","Saturnin","29/11","André","30/11","Florence","01/12"
  Data.s "Viviane","02/12","François-Xavier","03/12","Barbara","04/12","Gérald","05/12","Nicolas","06/12"
  Data.s "Ambroise","07/12","Immaculée Conception","08/12","Pierre Fourier","09/12","Romaric","10/12"
  Data.s "Daniel","11/12","Jeanne-Françoise de Chantal","12/12","Lucie","13/12","Odile","14/12"
  Data.s "Ninon","15/12","Alice","16/12","Gaël","17/12","Gatien","18/12","Urbain","19/12"
  Data.s "Théophile","20/12","Pierre Canisius", "21/12","Françoise-Xavière","22/12","Armand","23/12"
  Data.s "Adèle","24/12","Emmanuel", "25/12","Etienne","26/12","Jean","27/12","Innocents","28/12"
  Data.s "David","29/12","Roger","30/12","Sylvestre","31/12","Auguste","29/02"
EndDataSection
;}
;{ Fêtes à souhaiter
  Restore fetes
  For z = 1 To 366
    Read$ Fete$
    Read$ Date$
    AddMapElement(Fetes_Journalieres(), Str(z))
    
    Fetes_Journalieres()\Index = z
    Fetes_Journalieres()\Fete = Fete$
    Fetes_Journalieres()\Date = Date$
  Next z
  ;}
Procedure.q AnalyserDate(Masque.s, Date.s)
  Protected.q Annee, Mois, Jour, Heure, Minute, Seconde
  Jour    = Val(RSet(StringField(Date, 1, "/"), 2, "0"))
  Mois    = Val(RSet(StringField(Date, 2, "/"), 2, "0"))
  Annee   = Val(RSet(StringField(Date, 3, "/"), 4, "0"))
  Heure   = Val(RSet(StringField(Date, 4, " "), 2, "0"))
  Minute  = Val(RSet(StringField(Date, 5, ":"), 2, "0"))
  Seconde = Val(RSet(StringField(Date, 6, ":"), 2, "0"))
  
  ProcedureReturn Date(Annee, Mois, Jour, Heure, Minute, Seconde)
EndProcedure
;Debug "AnalyserDate(" + #DQUOTE$ + "%dd/%mm/%yyyy - %hh:%ii:%ss" + #DQUOTE$ + ", " + #DQUOTE$ + "19/06/1950 - 21:45:20" + #DQUOTE$ + ") = " +
;      Str(AnalyserDate("%dd/%mm/%yyyy - %hh:%ii:%ss", "19/06/1950 - 21:45:20"))
;Debug "ParseDate(" + #DQUOTE$ + "%dd/%mm/%yyyy - %hh:%ii:%ss" + #DQUOTE$ + ", " + #DQUOTE$ + "19/06/1950 - 21:45:20" + #DQUOTE$ + ") = " + ParseDate("%dd/%mm/%yyyy - %hh:%ii:%ss", "19/06/1950 - 21:45:20")
Procedure.q ConvertirEnFileTime(Date.q)
  ProcedureReturn Date + 11644473600
EndProcedure
;Debug ConvertirEnFileTime(AnalyserDate("%dd/%mm/%yyyy - %hh:%ii:%ss", "01/01/1970 - 00:00:00"))  ; Devrait donner 11644473600
;Debug ConvertirEnFileTime(ParseDate("%dd/%mm/%yyyy - %hh:%ii:%ss", "01/01/2015 - 00:00:00"))  ; Devrait donner 13064473600
Procedure.b SiBissextile(Annee=-1)
  ;Retourne Vrai si l'année est une année bissextile (366 jours)
  ;S'il n'y a aucun argument, l'année en cours est utilisée
  ;Dans le calendrier grégorien, l'année bissextile est
  ;toute année divisible par 4,sauf
  ;année du centenaire non divisible par 400
  ;L'année équinoxe de printemps est d'environ 365.242374 jours longs (et croissants)
  If Annee<=0
    Annee=Val(FormatDate("yyyy", Date()))
  EndIf;Cetteannée
  If(Mod(Annee,400)=0) Or ((Mod(Annee,4)=0)And(Mod(Annee,100)<>0))
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure
;Debug SiBissextile(2024)  ; ✅ Doit retourner #True (bissextile)
;Debug SiBissextile(2020)  ; ✅ Doit retourner #True (bissextile)
;Debug SiBissextile(2016)  ; ✅ Doit retourner #True (bissextile)
;Debug SiBissextile(2023)  ; ❌ Doit retourner #False (non bissextile)
;Debug SiBissextile(2019)  ; ❌ Doit retourner #False (non bissextile)
;Debug SiBissextile(1900)  ; ❌ Doit retourner #False (non bissextile)
;Debug SiBissextile(2000)  ; ✅ Doit retourner #True (bissextile)
;Debug SiBissextile(2400)  ; ✅ Doit retourner #True (bissextile)
;Debug SiBissextile()      ; ✅ Doit retourner #True ou #False selon l'année en cours
Procedure JoursDansMois(Annee, Mois) ;Retoure le nombre de jours dans le mois donné
  Select Mois
    Case 1,3,5,7,8,10,12 : ProcedureReturn 31
    Case 4,6,9,11 : ProcedureReturn 30
    Default : ProcedureReturn 28 + SiBissextile(Annee)
  EndSelect
EndProcedure
;Debug JoursDansMois(2024, 1)  ; ✅ Doit retourner 31
;Debug JoursDansMois(2024, 3)  ; ✅ Doit retourner 31
;Debug JoursDansMois(2024, 7)  ; ✅ Doit retourner 31
;Debug JoursDansMois(2024, 4)  ; ✅ Doit retourner 30
;Debug JoursDansMois(2024, 6)  ; ✅ Doit retourner 30
;Debug JoursDansMois(2024, 11) ; ✅ Doit retourner 30
;Debug JoursDansMois(2024, 2)  ; ✅ Doit retourner 29 (année bissextile)
;Debug JoursDansMois(2000, 2)  ; ✅ Doit retourner 29 (année bissextile)
;Debug JoursDansMois(2023, 2)  ; ❌ Doit retourner 28 (année normale)
;Debug JoursDansMois(1900, 2)  ; ❌ Doit retourner 28 (année normale)
Procedure.w JourDAnnee(Date.q) ;Retourne le nombre de jours écoulés depuis le début de l'année de la date spécifiée (entre 1 et 366).
  Protected Annee.w, Jours.w, DateDebutAnnee.q    
  If (Date < 0)
    ProcedureReturn 0
  EndIf    
  ; Récupérer l'année de la date donnée
  Annee = Val(FormatDate("%yyyy", Date))    
  ; Calculer le timestamp du 1er janvier de cette année
  DateDebutAnnee = Date(Annee, 1, 1, 0, 0, 0)    
  ; Calculer le nombre de jours écoulés depuis le début de l'année
  Jours = (Date - DateDebutAnnee) / 86400 + 1
  ProcedureReturn Jours
EndProcedure
;Debug JourDAnnee(Date(2024, 1, 1, 0, 0, 0))  ; ✅ Doit retourner 1
;Debug JourDAnnee(Date(2024, 1, 15, 0, 0, 0)) ; ✅ Doit retourner 15
;Debug JourDAnnee(Date(2024, 6, 30, 0, 0, 0)) ; ✅ Doit retourner 182 (année bissextile)
;Debug JourDAnnee(Date(2023, 6, 30, 0, 0, 0)) ; ✅ Doit retourner 181 (année normale)
;Debug JourDAnnee(Date(2024, 12, 31, 0, 0, 0)); ✅ Doit retourner 366 (année bissextile)
;Debug JourDAnnee(Date(2023, 12, 31, 0, 0, 0)); ✅ Doit retourner 365 (année normale)
Procedure.b JourDeSemaine(Date.q) ;Renvoie la valeur du jour dans la semaine de la date spécifiée (0 = dimanche, 6 = samedi).
  Protected Jours.q, joursemaine.b
  If (Date < 0)
    ProcedureReturn 0
  EndIf
  Jours = Date/86400
  joursemaine = (Jours + 4) % 7
  ProcedureReturn joursemaine
EndProcedure
;Debug JourDeSemaine(Date(1970, 1, 1, 0, 0, 0))  ; ✅ Doit retourner 4 (jeudi)
;Debug JourDeSemaine(Date(2024, 6, 19, 0, 0, 0)) ; ✅ Doit retourner 3 (mercredi)
;Debug JourDeSemaine(Date(2024, 6, 22, 0, 0, 0)) ; ✅ Doit retourner 6 (samedi)
;Debug JourDeSemaine(Date(2024, 6, 23, 0, 0, 0)) ; ✅ Doit retourner 0 (dimanche)
Procedure.q AjouterDate(Date.q, Champ.b, Compensation.d) ; Retourne une nouvelle date.
    Protected Mois.b, Annee.w
    
    If (Date < 0)
      ProcedureReturn Date
    EndIf
    
    Select Champ
      Case #PB_Date_Second
        Date + Compensation
        
      Case #PB_Date_Minute
        Date + Compensation * 60.0
        
      Case #PB_Date_Hour
        Date + Compensation * 3600.0
        
      Case #PB_Date_Day
        Date + Compensation * 86400.0
        
      Case #PB_Date_Week
        Date + Compensation * 7 * 86400.0
        
      Case #PB_Date_Month
        Mois = Month(Date) + Compensation
        Annee = Year(Date)
        
        ; Ajustement des mois et années
        Annee + (Mois - 1) / 12
        Mois = (Mois - 1) % 12 + 1
        
        Date = Date(Annee, Mois, Day(Date), Hour(Date), Minute(Date), Second(Date))
        
      Case #PB_Date_Year
        Date = Date(Year(Date) + Compensation, Month(Date), Day(Date), Hour(Date), Minute(Date), Second(Date))
    EndSelect
    
    ProcedureReturn Date
EndProcedure
;Debug FormatDate("%dd/%mm/%yyyy", AjouterDate(Date(2024, 6, 19, 0, 0, 0), #PB_Date_Day, 10))  ; ✅ Doit retourner "29/06/2024"
;Debug FormatDate("%dd/%mm/%yyyy", AjouterDate(Date(2024, 11, 19, 0, 0, 0), #PB_Date_Month, 3))  ; ✅ Doit retourner "19/02/2025"
;Debug FormatDate("%dd/%mm/%yyyy", AjouterDate(Date(2024, 6, 19, 0, 0, 0), #PB_Date_Year, 5))  ; ✅ Doit retourner "19/06/2029"
Procedure.s NomMois(Date.q) ;Retourne le nom du mois donné.
  Protected M = Month(Date.q)
  Protected NomMois.s = "janvier février mars avril mai juin juillet août septembre octobre novembre décembre"
  ProcedureReturn StringField(NomMois, M , " ")
EndProcedure
;Debug NomMois(Date(2024, 1, 1, 0, 0, 0))  ; ✅ Doit retourner "janvier"
;Debug NomMois(Date(2024, 6, 1, 0, 0, 0))  ; ✅ Doit retourner "juin"
;Debug NomMois(Date(2024, 12, 1, 0, 0, 0)) ; ✅ Doit retourner "décembre"
;Debug NomMois(Date(2024, 13, 1, 0, 0, 0)) ; ❌ Doit retourner "" (mois invalide)
Procedure.s NomMoisCourt(Date.q)          ;Retourne le nom du mois donné raccourçi.
  Protected M = Month(Date.q)
  Protected NomMois.s = "jan fév mar avr mai jun jui aoû sep oct nov déc"
  ProcedureReturn StringField(NomMois, M , " ")
EndProcedure
;Debug NomMoisCourt(Date(2024, 1, 1, 0, 0, 0))  ; ✅ Doit retourner "jan"
;Debug NomMoisCourt(Date(2024, 6, 1, 0, 0, 0))  ; ✅ Doit retourner "jun"
;Debug NomMoisCourt(Date(2024, 12, 1, 0, 0, 0)) ; ✅ Doit retourner "déc"
;Debug NomMoisCourt(Date(2024, 13, 1, 0, 0, 0)) ; ❌ Doit retourner "" (mois invalide)
Procedure.s NomJourSemaine(Date.q) ;Retourne le nom du jour de la semaine de la date donnée.
  Protected J = DayOfWeek(Date.q)
  Protected NomJours.s = "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi"
  ProcedureReturn StringField(NomJours, J + 1, ",")
EndProcedure
;Debug NomJourSemaine(Date(2024, 6, 16, 0, 0, 0))  ; ✅ Doit retourner "dimanche"
;Debug NomJourSemaine(Date(2024, 6, 17, 0, 0, 0))  ; ✅ Doit retourner "lundi"
;Debug NomJourSemaine(Date(2024, 6, 18, 0, 0, 0))  ; ✅ Doit retourner "mardi"
;Debug NomJourSemaine(Date(2024, 6, 19, 0, 0, 0))  ; ✅ Doit retourner "mercredi"
;Debug NomJourSemaine(Date(2024, 6, 20, 0, 0, 0))  ; ✅ Doit retourner "jeudi"
;Debug NomJourSemaine(Date(2024, 6, 21, 0, 0, 0))  ; ✅ Doit retourner "vendredi"
;Debug NomJourSemaine(Date(2024, 6, 22, 0, 0, 0))  ; ✅ Doit retourner "samedi"
Procedure.s NomJourSemaineCourt(Date.q) ;Retourne le nom du jour de la semaine de la date donnée.
  Protected J = DayOfWeek(Date.q)
  Protected NomJours.s = "dim,lun,mar,mer,jeu,ven,sam"
  ProcedureReturn StringField(NomJours, J + 1, ",")
EndProcedure
;Debug NomJourSemaineCourt(Date(2024, 6, 16, 0, 0, 0))  ; ✅ Doit retourner "dim"
;Debug NomJourSemaineCourt(Date(2024, 6, 17, 0, 0, 0))  ; ✅ Doit retourner "lun"
;Debug NomJourSemaineCourt(Date(2024, 6, 18, 0, 0, 0))  ; ✅ Doit retourner "mar"
;Debug NomJourSemaineCourt(Date(2024, 6, 19, 0, 0, 0))  ; ✅ Doit retourner "mer"
;Debug NomJourSemaineCourt(Date(2024, 6, 20, 0, 0, 0))  ; ✅ Doit retourner "jeu"
;Debug NomJourSemaineCourt(Date(2024, 6, 21, 0, 0, 0))  ; ✅ Doit retourner "ven"
;Debug NomJourSemaineCourt(Date(2024, 6, 22, 0, 0, 0))  ; ✅ Doit retourner "sam"
Procedure.s NomJourMois(Date.q) ; Retourne le nom du jour du mois donné.
    Protected J = Day(Date)
    Protected NomJourMois.s    
    Select J
        Case 1 To 9
            NomJourMois = "premier,deux,trois,quatre,cinq,six,sept,huit,neuf"
            ProcedureReturn StringField(NomJourMois, J, ",")            
        Case 10 To 19
            NomJourMois = "dix,onze,douze,treize,quatorze,quinze,seize,dix-sept,dix-huit,dix-neuf"
            ProcedureReturn StringField(NomJourMois, J - 9, ",")  ; Ajustement de l'index            
        Case 20 To 29
            NomJourMois = "vingt,vingt et un,vingt deux,vingt trois,vingt quatre,vingt cinq,vingt six,vingt sept,vingt huit,vingt neuf"
            ProcedureReturn StringField(NomJourMois, J - 19, ",")  ; Ajustement de l'index            
        Case 30 To 31
            NomJourMois = "trente,trente et un"
            ProcedureReturn StringField(NomJourMois, J - 29, ",")  ; Ajustement de l'index
    EndSelect    
    ProcedureReturn ""  ; Retourne une chaîne vide si J est invalide
EndProcedure
;Debug NomJourMois(Date(2024, 6, 1, 0, 0, 0))  ; ✅ Doit retourner "premier"
;Debug NomJourMois(Date(2024, 6, 5, 0, 0, 0))  ; ✅ Doit retourner "cinq"
;Debug NomJourMois(Date(2024, 6, 11, 0, 0, 0)) ; ✅ Doit retourner "onze"
;Debug NomJourMois(Date(2024, 6, 21, 0, 0, 0)) ; ✅ Doit retourner "vingt et un"
;Debug NomJourMois(Date(2024, 6, 30, 0, 0, 0)) ; ✅ Doit retourner "trente"
Procedure.s NomHeure(Date.q) ; Retourne le nom de l'heure donnée.
    Protected H = Hour(Date)
    Protected NomHeure.s
    Protected Texte.s
    
    ; Déterminer "heure" ou "heures"
    If H <= 1
        Texte = " heure"
    Else
        Texte = " heures"
    EndIf
    
    ; Liste des heures en toutes lettres
    NomHeure = "zéro,une,deux,trois,quatre,cinq,six,sept,huit,neuf,dix,onze,douze," +
               "treize,quatorze,quinze,seize,dix-sept,dix-huit,dix-neuf,vingt,vingt et un,vingt deux,vingt trois"
    
    ; Retourner le nom de l'heure avec le bon suffixe
    ProcedureReturn StringField(NomHeure, H + 1, ",") + Texte
EndProcedure
;Debug NomHeure(Date(2024, 6, 19, 0, 0, 0))  ; ✅ Doit retourner "zéro heure"
;Debug NomHeure(Date(2024, 6, 19, 1, 0, 0))  ; ✅ Doit retourner "une heure"
;Debug NomHeure(Date(2024, 6, 19, 5, 0, 0))  ; ✅ Doit retourner "cinq heures"
;Debug NomHeure(Date(2024, 6, 19, 21, 0, 0)) ; ✅ Doit retourner "vingt et un heures"
Procedure.s NomMinute(Date.q)
  Protected Mn = Minute(Date)
  Protected NomMinute.s
  Protected Texte.s
  If Mn <= 1
    Texte = " minute"
  Else
    Texte = " minutes"
  EndIf  
  NomMinute = "zéro,une,deux,trois,quatre,cinq,six,sept,huit,neuf,dix," + 
              "onze,douze,treize,quatorze,quinze,seize,dix-sept,dix-huit,dix-neuf,vingt," +
              "vingt et un,vingt deux,vingt trois,vingt quatre,vingt cinq,vingt six,vingt sept,vingt huit,vingt neuf," +
              "trente,trente et une,trente deux,trente trois,trente quatre,trente cinq,trente six,trente sept,trente huit,trente neuf," +
              "quarante,quarante et une,quarante deux,quarante trois,quarante quatre,quarante cinq,quarante six,quarante sept,quarante huit, quarante neuf," +
              "cinquante,cinquante et une,cinquante deux,cinquante trois,cinquante quatre,cinquante cinq,cinquante six,cinquante sept,cinquante huit,cinquante neuf"
  ProcedureReturn StringField(NomMinute.s, Mn + 1, ",") + Texte
EndProcedure
;Debug NomMinute(Date(2024, 6, 19, 0, 0, 0))  ; ✅ Doit retourner "zéro minute"
;Debug NomMinute(Date(2024, 6, 19, 0, 1, 0))  ; ✅ Doit retourner "une minute"
;Debug NomMinute(Date(2024, 6, 19, 0, 5, 0))  ; ✅ Doit retourner "cinq minutes"
;Debug NomMinute(Date(2024, 6, 19, 0, 21, 0)) ; ✅ Doit retourner "vingt et une minutes"
;Debug NomMinute(Date(2024, 6, 19, 0, 30, 0)) ; ✅ Doit retourner "trente minutes"
;Debug NomMinute(Date(2024, 6, 19, 0, 59, 0)) ; ✅ Doit retourner "cinquante neuf minutes"
Procedure.s NomSeconde(Date.q)
  Protected S = Second(Date)
  Protected NomSeconde.s
  Protected Texte.s
  If S <= 1
    Texte = " seconde"
  Else
    Texte = " secondes"
  EndIf
  
  NomSeconde = "zéro,une,deux,trois,quatre,cinq,six,sept,huit,neuf,dix," + 
               "onze,douze,treize,quatorze,quinze,seize,dix-sept,dix-huit,dix-neuf,vingt," +
               "vingt et un,vingt deux,vingt trois,vingt quatre,vingt cinq,vingt six,vingt sept,vingt huit,vingt neuf," +
               "trente,trente et une,trente deux,trente trois,trente quatre,trente cinq,trente six,trente sept,trente huit,trente neuf," +
               "quarante,quarante et une,quarante deux,quarante trois,quarante quatre,quarante cinq,quarante six,quarante sept,quarante huit, quarante neuf," +
               "cinquante,cinquante et une,cinquante deux,cinquante trois,cinquante quatre,cinquante cinq,cinquante six,cinquante sept,cinquante huit,cinquante neuf"
  ProcedureReturn StringField(NomSeconde, S + 1, ",") + Texte
EndProcedure
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 0))  ; ✅ Doit retourner "zéro seconde"
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 1))  ; ✅ Doit retourner "une seconde"
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 5))  ; ✅ Doit retourner "cinq secondes"
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 21)) ; ✅ Doit retourner "vingt et une secondes"
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 30)) ; ✅ Doit retourner "trente secondes"
;Debug NomSeconde(Date(2024, 6, 19, 0, 0, 59)) ; ✅ Doit retourner "cinquante neuf secondes"
Procedure.i DateSemaine1(Annee=-1, Premier_Jour=0) ; Retourne la date du début de la semaine 1
    Protected Decalage = 4  ; La date de janvier qui tombe toujours dans la semaine 1
    Protected Jourjan       ; Jour de la semaine du 4 janvier
    Protected date1jan      ; Date de décembre/janvier du début de la semaine 1
    
    ; Si l'année est absente, utiliser l'année en cours
    If Annee <= 0
        Annee = Year(Date())
    EndIf
    
    ; Déterminer le jour de la semaine du 4 janvier
    Jourjan = DayOfWeek(Date(Annee, 1, Decalage, 0, 0, 0))
    
    ; Calculer la date du début de la semaine 1
    date1jan = Decalage + Premier_Jour - Jourjan
    If Premier_Jour > Jourjan
        date1jan - 7
    EndIf
    
    ProcedureReturn date1jan
EndProcedure
;Debug DateSemaine1(2024, 1)  ; ✅ Doit retourner la date correcte du début de la semaine 1
;Debug DateSemaine1(2023, 0)  ; ✅ Doit retourner la date correcte du début de la semaine 1
;Debug DateSemaine1(2025, 3)  ; ✅ Doit retourner la date correcte du début de la semaine 1  
Procedure.i SemaineDAnnee(date.q=-1, Premier_Jour=0)
  ; Retourne le nombre de semaines (1 .. 53) écoulées depuis le
  ;   début de l'année pour la date donnée
  ; Si la date est absente, la date d'aujourd'hui est utilisée
  ; L'argument 'Premier_Jour' identifie la "premier jour de chaque semaine"
  ;   Dimanche=0 .. Samedi=6
  Protected date1jan ; Date en janvier au début de la semaine 1
  If date<0
    date = Year(Date())
  EndIf ; Maintenant
  date1jan = DateSemaine1(Year(date), Premier_Jour)
  ProcedureReturn (JourDAnnee(date)-date1jan)/7+1
EndProcedure
;Debug SemaineDAnnee(Date(2024, 6, 19, 0, 0, 0), 1)  ; ✅ Doit retourner la semaine correcte
;Debug SemaineDAnnee(Date(2024, 1, 5, 0, 0, 0), 1)   ; ✅ Doit retourner 1 (semaine 1)
;Debug SemaineDAnnee(Date(2024, 12, 31, 0, 0, 0), 1) ; ✅ Doit retourner 52 ou 53 selon l'année
Procedure.i NbreJoursRestantsMois(date.q)
  Protected Jour.i 
  jour = JoursDansMois(Year(Date()), Month(Date())) - Day(Date)
  ProcedureReturn Jour
EndProcedure
;Debug NbreJoursRestantsMois(Date(2025, 6, 19, 0, 0, 0))  ; ✅ Doit retourner le nombre de jours restants dans le mois actuel
;Debug NbreJoursRestantsMois(Date(2024, 6, 30, 0, 0, 0))  ; ✅ Doit retourner 0 (dernier jour du mois)
;Debug NbreJoursRestantsMois(Date(2024, 2, 15, 0, 0, 0))  ; ✅ Doit retourner 14 (année bissextile)
Procedure.q NbreJoursRestantsAnnee() ; Retourne le nombre de jours restants dans l'année en cours
    ProcedureReturn DayOfYear(Date(Year(Date()), 12, 31, 0, 0, 0)) - DayOfYear(Date())
EndProcedure
;Debug NbreJoursRestantsAnnee()  ; ✅ Doit retourner le nombre de jours restants dans l'année actuelle
Procedure.s FormatDiffDates(resultat.d, Unite) ; Formate le résultat avec le nom de l'unité
    Protected Texte.s
    
    ; Déterminer le texte de l'unité
    Select Unite
        Case #PB_Date_Year
            Texte = " an"
            If resultat > 1 : Texte + "s" : EndIf
        Case #PB_Date_Month
            Texte = " mois"  ; "mois" est invariable
        Case #PB_Date_Week
            Texte = " semaine"
            If resultat > 1 : Texte + "s" : EndIf
        Case #PB_Date_Day
            Texte = " jour"
            If resultat > 1 : Texte + "s" : EndIf
        Case #PB_Date_Hour
            Texte = " heure"
            If resultat > 1 : Texte + "s" : EndIf
        Case #PB_Date_Minute
            Texte = " minute"
            If resultat > 1 : Texte + "s" : EndIf
        Case #PB_Date_Second
            Texte = " seconde"
            If resultat > 1 : Texte + "s" : EndIf
        Default
            Texte = ""  ; Erreur ou unité inconnue
    EndSelect
    
    ; Vérifier si le résultat est un entier ou un nombre décimal
    If resultat = Int(resultat)
        ProcedureReturn Str(Int(resultat)) + Texte
    Else
        ProcedureReturn StrD(resultat, 2) + Texte
    EndIf
EndProcedure
Procedure.d DiffDates(datedebut.q, datefin.q=-1, Unite=#PB_Date_Day, multiple.q=1) ; Calcule la différence entre deux dates
  Protected signe = 1, Secondes.d, diff.d, date.q
  
  ; Vérification des paramètres
  If multiple <= 0
    ProcedureReturn 0
  EndIf
  
  ; Si datefin est absente ou négative, utiliser la date actuelle
  If datefin < 0
    datefin = Date(Year(Date()), Month(Date()), Day(Date()), Hour(Date()), Minute(Date()), Second(Date()))
  EndIf
  
  ; Inverser les dates si nécessaire
  If datedebut > datefin
    signe = -1
    Swap datedebut, datefin
  EndIf
  
  ; Obtenir la différence de date en secondes
  diff = datefin - datedebut
  
  ; Déterminer le facteur de conversion en secondes
  Select Unite
    Case #PB_Date_Year
      Secondes = 365.25 * 86400.0
    Case #PB_Date_Month
      Secondes = (365.25 / 12.0) * 86400.0
    Case #PB_Date_Week
      Secondes = 7.0 * 86400.0
    Case #PB_Date_Day
      Secondes = 86400.0
    Case #PB_Date_Hour
      Secondes = 3600.0
    Case #PB_Date_Minute
      Secondes = 60.0
    Case #PB_Date_Second
      Secondes = 1.0
    Default
      ProcedureReturn 0 ; Erreur
  EndSelect
  
  ; Ajustement pour les trimestres et quinzaines
  If Unite = #PB_Date_Month And multiple = 3
    multiple = 1  ; Un trimestre = 3 mois, donc on garde l'unité en mois
  EndIf
  
  If Unite = #PB_Date_Week And multiple = 2
    multiple = 1  ; Une quinzaine = 2 semaines, donc on garde l'unité en semaines
  EndIf
  
  ; Calculer la différence en unités demandées
  Protected resultat.d
  resultat = Round(diff / (multiple * Secondes), #PB_Round_Nearest)
  
  ; Ajustement de l'approximation
  date = AjouterDate(datedebut, Unite, multiple * resultat)
  While date < datefin
    date = AjouterDate(date, Unite, multiple)
    resultat + 1.0
  Wend
  
  ProcedureReturn signe * resultat
EndProcedure
;Debug "DiffDate()"
;Debug DiffDates(Date(2024, 6, 1, 0, 0, 0), Date(2024, 6, 19, 0, 0, 0), #PB_Date_Day) ; ✅ Doit retourner 18
;Debug DiffDates(Date(2024, 1, 1, 0, 0, 0), Date(2024, 6, 1, 0, 0, 0), #PB_Date_Month); ✅ Doit retourner 5
;Debug DiffDates(Date(2020, 1, 1, 0, 0, 0), Date(2024, 1, 1, 0, 0, 0), #PB_Date_Year) ; ✅ Doit retourner 4
;Debug DiffDates(Date(2024, 1, 1, 0, 0, 0), Date(2024, 6, 1, 0, 0, 0), #PB_Date_Month, 3) ; ✅ Doit retourner environ 1.67 trimestres
;Debug DiffDates(Date(2024, 6, 1, 0, 0, 0), Date(2024, 6, 19, 0, 0, 0), #PB_Date_Week, 2) ; ✅ Doit retourner environ 1.29 quinzaines
;Debug "Formaté"
;Debug FormatDiffDates(18.0, #PB_Date_Day)    ; ✅ Doit retourner "18 jours"
;Debug FormatDiffDates(5.0, #PB_Date_Month)   ; ✅ Doit retourner "5 mois"
;Debug FormatDiffDates(4.0, #PB_Date_Year)    ; ✅ Doit retourner "4 ans"
;Debug FormatDiffDates(1.5, #PB_Date_Month)   ; ✅ Doit retourner "1.50 mois"
;Debug FormatDiffDates(2.75, #PB_Date_Week)   ; ✅ Doit retourner "2.75 semaines"
Procedure.s Premier_Ouvre_Mois(Annee.i, Mois.i) ; Retourne la date "Jour jj mois aaaa" du premier jour ouvré du mois donné
    Protected Jour.i = 1
    Protected JourSem.i = DayOfWeek(Date(Annee, Mois, Jour, 0, 0, 0))
    
    Select Mois
      Case 1, 5, 11
        Select JourSem
          Case 0:Jour + 1:JourSem = 1
          Case 1 To 4:Jour + 1:JourSem + 1
          Case 5:Jour + 3:JourSem = 1
          Case 6:Jour + 2:JourSem = 1
        EndSelect 
      Case 2 To 4, 6 To 10, 12
        Select JourSem
          Case 0:Jour + 1:JourSem = 1
          Case 1 To 5:DatePremierJourOuvre=Date(Annee,Mois,Jour,0,0,0)
          Case 6:Jour + 2:JourSem = 1
        EndSelect
    EndSelect
    DatePremierJourOuvre=Date(Annee,Mois,Jour,0,0,0)
        
    ; Retourner la date formatée "Jour jj mois aaaa"
    ProcedureReturn NomJourSemaine(DatePremierJourOuvre) + " " + NomJourMois(DatePremierJourOuvre) + " " + NomMois(DatePremierJourOuvre) + " " + Str(Annee)
EndProcedure
;Debug "Mois normaux"
;Debug Premier_Ouvre_Mois(2024, 6)  ; ✅ Doit retourner "lundi trois juin 2024"
;Debug Premier_Ouvre_Mois(2024, 11) ; ✅ Doit retourner "lundi quatre novembre 2024"
;Debug "Mois commençant un dimanche"
;Debug Premier_Ouvre_Mois(2024, 9)  ; ✅ Doit retourner "lundi deux septembre 2024"
;Debug "Mois commençant un samedi"
;Debug Premier_Ouvre_Mois(2024, 3)  ; ✅ Doit retourner "vendredi premier mars 2024"
Procedure.s ChercherVendredi13(Annee,Mois) ;Retourne la date "ds jj/mm/aaaa" du mois et de l'année donnés
  If Annee < 1
    Annee = Year(Date())
  EndIf  
  If Mois < 1
    Mois = Month(Date())
  EndIf  
  Protected Jour=13
  Protected.q DateVendredi13=Date(Annee,Mois,Jour,0,0,0)
  
  ;Cherche le vendredi 13
  If JourDeSemaine(DateVendredi13) = 5
    ProcedureReturn "Vendredi 13 " + Str(Mois) + "/" + Str(Annee)
  EndIf
  
  ; Aucun vendredi 13 trouvé
  ProcedureReturn "Aucun vendredi 13 en " + Str(Mois) + "/" + Str(Annee)
EndProcedure
;Debug "Mois avec vendredi 13"
;Debug ChercherVendredi13(2025, 6)  ; ✅ "Vendredi 13 13/6/2025"
;Debug ChercherVendredi13(2024, 9)  ; ✅ "Vendredi 13 13/9/2024"
;Debug "Mois sans vendredi 13"
;Debug ChercherVendredi13(2024, 7)  ; ✅ "Aucun vendredi 13 en 7/2024"
;Debug ChercherVendredi13(2025, 10) ; ✅ "Aucun vendredi 13 en 10/2025"
Procedure TrouverPremierDimanche(Annee.i, Mois.i) ; Retourne "Dimanche jj/mm/aaaa"
    Protected Jour.i = 1
    Protected DatePremierDimanche.q = Date(Annee, Mois, Jour, 0, 0, 0)
    
    ; Chercher le premier dimanche
    While DayOfWeek(DatePremierDimanche) <> 0
        Jour + 1
        ;If Jour > JoursDansMois(Annee, Mois) ; Vérification pour éviter un dépassement
        ;    ProcedureReturn "Aucun dimanche trouvé"
        ;EndIf
        DatePremierDimanche = Date(Annee, Mois, Jour, 0, 0, 0)
    Wend
    
    ; Retourner une date formatée
    ;ProcedureReturn "Dimanche " + Str(Jour) + "/" + Str(Mois) + "/" + Str(Annee)
EndProcedure
;Debug TrouverPremierDimanche(2025, 6)  ; ✅ "Dimanche 1/6/2025"
;Debug TrouverPremierDimanche(2024, 9)  ; ✅ "Dimanche 1/9/2024"
;Debug TrouverPremierDimanche(2024, 7)  ; ✅ "Dimanche 7/7/2024"
;Debug TrouverPremierDimanche(2024, 2)  ; ✅ "Dimanche 4/2/2024"
Procedure TrouverDeuxiemeDimanche(Annee, Mois)
  Protected Jour=7
  Protected DateDeuxiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
  ;Cherche le deuxième dimanche
  While JourDeSemaine(DateDeuxiemeDimanche)<>0    
    Jour+1
    DateDeuxiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    If DateDeuxiemeDimanche = TrouverPremierDimanche(Annee, Mois)
      DateDeuxiemeDimanche + 7
    EndIf  
  Wend
  ProcedureReturn DateDeuxiemeDimanche  
EndProcedure
;Debug FormatDate("%dd/%mm/%yyyy", TrouverDeuxiemeDimanche(2025, 6))
Procedure TrouverTroisiemeDimanche(Annee,Mois)
  Protected Jour=14
  Protected DateTroisiemeDimanche=Date(Annee,Mois,Jour,0,0,0)    
  ;Cherche le Troisième dimanche
  While JourDeSemaine(DateTroisiemeDimanche)<>0      
    Jour+1
    DateTroisiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    If DateTroisiemeDimanche = TrouverDeuxiemeDimanche(Annee, Mois)
      DateTroisiemeDimanche + 7
    EndIf  
  Wend    
  ProcedureReturn DateTroisiemeDimanche    
EndProcedure
;Debug FormatDate("%dd/%mm/%yyyy", TrouverTroisiemeDimanche(2025, 6))
Procedure TrouverQuatriemeDimanche(Annee,Mois)
  Protected Jour=21
  Protected DateQuatriemeDimanche=Date(Annee,Mois,Jour,0,0,0)    
  ;Cherche le Quatrième dimanche
  While JourDeSemaine(DateQuatriemeDimanche)<>0      
    Jour+1
    DateQuatriemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    If DateQuatriemeDimanche = TrouverTroisiemeDimanche(Annee, Mois)
      DateQuatriemeDimanche + 7
    EndIf  
  Wend    
  ProcedureReturn DateQuatriemeDimanche    
EndProcedure
;Debug FormatDate("%dd/%mm/%yyyy", TrouverQuatriemeDimanche(2025, 6))
;Dernier dimanche du mois
Procedure TrouverDernierDimanche(Annee,Mois)
  Protected Jour=JoursDansMois(Annee, Mois) - 6
  Protected DateDernierDimanche=Date(Annee,Mois,Jour,0,0,0)
  ;Cherche le dernier dimanche
  While JourDeSemaine(DateDernierDimanche)<>0      
    Jour+1
    DateDernierDimanche=Date(Annee,Mois,Jour,0,0,0)
  Wend
  ProcedureReturn DateDernierDimanche    
EndProcedure
;Debug FormatDate("%dd/%mm/%yyyy", TrouverDernierDimanche(2025, 9))
Procedure$ SigneAstro(Jour,Mois);Permet de déterminer le signe astrologique correspondant au jour et au mois donnés
  Protected$ Resultat    
  If(Jour>=22 And Mois=12)Or(Jour<=20 And Mois=1)
    Resultat="Capricorne"
  ElseIf(Jour>=21 And Mois=1)Or(Jour<=19 And Mois=2)
    Resultat="Verseau"
  ElseIf(Jour>=20 And Mois=2)Or(Jour<=20 And Mois=3)
    Resultat="Poissons"
  ElseIf(Jour>=21 And Mois=3)Or(Jour<=20 And Mois=4)
    Resultat="Bélier"
  ElseIf(Jour>=21 And Mois=4)Or(Jour<=21 And Mois=5)
    Resultat="Taureau"
  ElseIf(Jour>=22 And Mois=5)Or(Jour<=21 And Mois=6)
    Resultat="Gémeaux"
  ElseIf(Jour>=22 And Mois=6)Or(Jour<=22 And Mois=7)
    Resultat="Cancer"
  ElseIf(Jour>=23 And Mois=7)Or(Jour<=22 And Mois=8)
    Resultat="Lion"
  ElseIf(Jour>=23 And Mois=8)Or(Jour<=22 And Mois=9)
    Resultat="Vierge"
  ElseIf(Jour>=23 And Mois=9)Or(Jour<=22 And Mois=10)
    Resultat="Balance"
  ElseIf(Jour>=23 And Mois=10)Or(Jour<=22 And Mois=11)
    Resultat="Scorpion"
  ElseIf(Jour>=23 And Mois=11)Or(Jour<=21 And Mois=12)
    Resultat="Sagittaire"
  EndIf    
  ProcedureReturn Resultat
EndProcedure
;Debug "SigneAstro(19, 6) = " + SigneAstro(19, 6)
Procedure$ Element_Astro(Jour, Mois)
  Select SigneAstro(Jour, Mois)
    Case "Bélier", "Lion", "Sagittaire"
      ProcedureReturn "Feu"
    Case "Taureau", "Vierge", "Capricorne"
      ProcedureReturn "Terre"
    Case "Gémeaux", "Balance", "Verseau"
      ProcedureReturn "Air"
    Case "Cancer", "Scorpion", "Poissons"
      ProcedureReturn "Eau"
  EndSelect    
EndProcedure
;Debug "Element_Astro(19, 6) = " + Element_Astro(19, 6)
Procedure Heure_d_ete(Annee=-1) ;l'heure d'été commence toujours le dernier dimanche de mars
  Protected Resultat = TrouverDernierDimanche(Annee,3)
  If Resultat = -1
    Resultat = TrouverQuatriemeDimanche(Annee,3)
  EndIf  
  ProcedureReturn Resultat
EndProcedure
;For i = 2000 To 2025
;  Debug "Heure_d_ete("+ i +") = " + FormatDate("%dd/%mm/%yyyy", Heure_d_ete(i))
;Next i
Procedure Heure_d_hiver(Annee=-1) ;l'heure d'hiver commence toujours le dernier dimanche d'octobre
  Protected Resultat
  Resultat = TrouverDernierDimanche(Annee,10)
  If Resultat = -1
    Resultat = TrouverQuatriemeDimanche(Annee,10)
  EndIf
  ProcedureReturn Resultat
EndProcedure
;For i = 2000 To 2025
;  Debug "Heure_d_hiver("+ i +") = " + FormatDate("%dd/%mm/%yyyy", Heure_d_hiver(i))
;Next i
Procedure.s AjouterUniteTemps(nombre.q, unite.q) ;Ajoute une unité de temps dans une valeur de temps donnée
  Protected Resultat.s, uniteSeconde.s
  If nombre = 0 : ProcedureReturn "" : EndIf
  If nombre < 0 : nombre * -1 : EndIf
  uniteSeconde = StringField(#UniteTemps, unite, ",")
  If nombre > 1
    uniteSeconde = RemoveString(uniteSeconde, "|")
  Else
    uniteSeconde = StringField(uniteSeconde, 1, "|")
  EndIf
  Resultat + Space(1) + Str(nombre) + Space(1) + uniteSeconde 
  ProcedureReturn Resultat
EndProcedure
;Debug AjouterUniteTemps(1, 1)  ; "1 mois"
;Debug AjouterUniteTemps(3, 3)  ; "3 jours"
;Debug AjouterUniteTemps(0, 5)  ; "" (car zéro)
;Debug AjouterUniteTemps(-4, 6) ; "4 secondes" (gestion des négatifs)
Procedure.s DiffTemps(Secondes.q) ;Calcile la diffenrence de temps entre 2 dates
  Protected Resultat.s
  Protected annees.q, mois.q, jours.q, heures.q, Minutes.q
  annees = Secondes / 31557600 : Secondes = Secondes % 31557600
  mois = Secondes / 2629800 : Secondes = Secondes % 2629800
  jours  = Secondes / 86400 : Secondes = Secondes % 86400
  heures = Secondes / 3600 : Secondes = Secondes % 3600 
  Minutes = Secondes / 60  : Secondes = Secondes % 60
  
  MaDiff\Annees = annees
  MaDiff\Mois = mois
  MaDiff\JoursRestants = jours
  MaDiff\Heures = heures
  MaDiff\Minutes = minutes
  MaDiff\Secondes = Secondes
  MaDiff\TotalJours = annees * 365.25 + mois * 30.4375 + jours
  MaDiff\sAnnees = Str(annees)
  MaDiff\sMois = Str(mois)
  MaDiff\sJoursRestants = Str(jours)
  MaDiff\sHeures = Str(heures)
  MaDiff\sMinutes = Str(Minutes)
  MaDiff\sSecondes = Str(Secondes)
  MaDiff\sTotalJours = Str(annees * 365.25 + mois * 30.4375 + jours)
  Resultat = AjouterUniteTemps(annees, 1)
  Resultat + AjouterUniteTemps(mois, 2)
  Resultat + AjouterUniteTemps(jours,3)
  Select Resultat 
    Case ""
      Resultat =  "aujourd'hui"
    Case " 1 jour"
      Resultat = "demain"
  EndSelect
  ProcedureReturn Resultat
EndProcedure
;Debug DiffTemps(Date(1970 + 11,1,1,0,0,0))
Procedure Echanger(*a, *b)
  Protected temp = *a
  *a = *b
  *b = temp
EndProcedure
Procedure.s Calculer_Age(A_avant, M_avant, J_avant, A_apres, M_apres, J_apres)
  Protected.q DateAvant2D, DateApres2D 
  DateAvant2D = Date(A_avant, M_avant, J_avant, 0, 0, 0)
  DateApres2D = Date(A_apres, M_apres, J_apres, 0, 0, 0)
  If DateAvant2D > DateApres2D
    Echanger(DateApres2D, DateAvant2D)
  EndIf  
  ProcedureReturn DiffTemps(DateApres2D - DateAvant2D)
EndProcedure
;Debug "Le 19 juin 2025, j'aurai" + Calculer_Age(1950, 6, 19, 2025, 6, 19)
Procedure Anniversaire_Dans(AnneeNaissance, MoisNaissance, JourNaissance)
  Protected.q DateNaissance, DateAnniversaire
  Protected Resultat
  DateNaissance = Date(AnneeNaissance, MoisNaissance, JourNaissance,0,0,0)
  DateAnniversaire = (Date(Year(Date()), MoisNaissance, JourNaissance, 0,0,0))
  Resultat = DiffDates(Date(), DateAnniversaire, #PB_Date_Day)
  If Resultat <= 0
    DateAnniversaire = AjouterDate(DateAnniversaire, #PB_Date_Year, 1)
  EndIf
  ProcedureReturn DiffDates(Date(), DateAnniversaire, #PB_Date_Day)
EndProcedure
;Debug "Anniversaire_Dans(1950, 6, 19) dans " + Anniversaire_Dans(1950, 6, 19) + " jours"
Procedure Calculer_Date_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
  Protected.q DateNaissance, DateAnniversaire
  Protected Resultat
  DateNaissance = Date(AnneeNaissance, MoisNaissance, JourNaissance, 0, 0, 0)
  DateAnniversaire = Date(Year(Date()), MoisNaissance, JourNaissance, 0, 0, 0)
  Resultat = DiffDates(Date(), DateAnniversaire, #PB_Date_Day)
  If Resultat < 0
    DateAnniversaire = AjouterDate(DateAnniversaire, #PB_Date_Year, 1)
  EndIf
  ProcedureReturn DateAnniversaire
EndProcedure
;Debug "Date d'anniversaire = " + FormatDate("%dd/%mm/%yyyy", Calculer_Date_Anniversaire(1950, 6, 19))
Procedure.s Decomposer_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
  Protected.q DateAnniversaire = Calculer_Date_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
  ProcedureReturn DiffTemps(Date(Year(Date()),Month(Date()), Day(Date()),0,0,0)-DateAnniversaire)
EndProcedure
;Debug "Anniversaire dans" + Decomposer_Anniversaire(1950, 6, 19)
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Date2 par Micoute

Message par Micoute »

Bonjour à tous,

Avez-vous trouvé ce fichier utile ? Ou Des idées pour l’améliorer ?
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Date2 par Micoute

Message par SPH »

Salut,

a vrai dire, je l'ai lancé sous PB (6.21) mais... rien. Le programme s'éteint tel un "End"

As tu un code d'exemple concret ?


Merci Micoute :wink:

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Mindphazer
Messages : 693
Inscription : mer. 24/août/2005 10:42

Re: Date2 par Micoute

Message par Mindphazer »

Salut SPH,
décommente tous les debug, tu auras des exemples :wink:
Bureau : Win10 64bits
Maison : Macbook Pro M3 16" SSD 512 Go / Ram 24 Go - iPad Pro 32 Go (pour madame) - iPhone 15 Pro Max 256 Go
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Date2 par Micoute

Message par Micoute »

Bonjour à tous,

merci d'avoir essayé.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
SPH
Messages : 4937
Inscription : mer. 09/nov./2005 9:53

Re: Date2 par Micoute

Message par SPH »

Mindphazer a écrit : lun. 16/juin/2025 10:43 Salut SPH,
décommente tous les debug, tu auras des exemples :wink:
Exact.
Micoute : ça marche sur PB6.21 W11. Tu as du prendre un temps fou a référencer tous les noms (les data) 8)

!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.12LTS- 64 bits
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Date2 par Micoute

Message par Ar-S »

J'avoue que pour l'éphéméride c'est top. Merci.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Date2 par Micoute

Message par Micoute »

Bonjour à tous,

si j'ai réussi à vous faire plaisir, alors ma mission est réussie et j'en tire une grande joie, peut importe le temps que ça m'a pris, j'adore programmer avec PureBasic qui mérite d'être plus connu.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Micoute
Messages : 2583
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Date2 par Micoute (suite)

Message par Micoute »

Bonjour à tous,

j'ai programmé une suite concernant les dates, alors je la partage avec vous.

Code : Tout sélectionner

Procedure.i CalculerDateFuture(DateOriginale.i, Compensation.d, Champ.i)
  Protected Mois.i, Annee.i, Jour.i, Heure.i, Minute.i, Seconde.i
  Protected NouvelleDate.i
  
  ; Extraire les composants de la date d'origine
  Annee  = Year(DateOriginale)
  Mois   = Month(DateOriginale)
  Jour   = Day(DateOriginale)
  Heure  = Hour(DateOriginale)
  Minute = Minute(DateOriginale)
  Seconde= Second(DateOriginale)
  
  Select Champ
    Case #PB_Date_Second
      NouvelleDate = DateOriginale + Compensation
      
    Case #PB_Date_Minute
      NouvelleDate = DateOriginale + Compensation * 60
      
    Case #PB_Date_Hour
      NouvelleDate = DateOriginale + Compensation * 3600
      
    Case #PB_Date_Day
      NouvelleDate = DateOriginale + Compensation * 86400
      
    Case #PB_Date_Week
      NouvelleDate = DateOriginale + Compensation * 7 * 86400
      
    Case #PB_Date_Month
      Mois + Compensation
      While Mois > 12
        Mois - 12
        Annee + 1
      Wend
      While Mois < 1
        Mois + 12
        Annee - 1
      Wend
      
      ; Ajuster le jour si trop grand pour le mois cible
      If Jour > Day(Date(Annee, Mois, 1, 0, 0, 0))
        Jour = Day(Date(Annee, Mois, 1, 0, 0, 0))
      EndIf
      
      
      NouvelleDate = Date(Annee, Mois, Jour, Heure, Minute, Seconde)
      
    Case #PB_Date_Year
      Annee  + Compensation
      
      ; Corriger le jour si l'année cible n'est pas bissextile
      If Mois = 2 And Jour = 29 And Not (Annee % 4 = 0 And (Annee % 100 <> 0 Or Annee % 400 = 0))
        Jour = 28
      EndIf
      
      If Jour > Day(Date(Annee, Mois, 1, 0, 0, 0))
        Jour = Day(Date(Annee, Mois, Day(Date()), 0, 0, 0))
      EndIf
      
      NouvelleDate = Date(Annee, Mois, Jour, Heure, Minute, Seconde)
      
    Default
      Debug "Champ non reconnu"
      NouvelleDate = DateOriginale
  EndSelect
  
  ProcedureReturn NouvelleDate
EndProcedure
;MaDate = CalculerDateFuture(Date(), 1, #PB_Date_Year)
;Debug FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", MaDate)
Procedure.i CalculerDatePassee(DateOriginale.i, Compensation.d, Champ.i)
  Protected Mois.i, Annee.i, Jour.i, Heure.i, Minute.i, Seconde.i
  Protected NouvelleDate.i
  
  Select Champ
    Case #PB_Date_Second
      NouvelleDate = DateOriginale - Compensation
      
    Case #PB_Date_Minute
      NouvelleDate = DateOriginale - Compensation * 60.0
      
    Case #PB_Date_Hour
      NouvelleDate = DateOriginale - Compensation * 3600.0
      
    Case #PB_Date_Day
      NouvelleDate = DateOriginale - Compensation * 86400.0
      
    Case #PB_Date_Week
      NouvelleDate = DateOriginale - Compensation * 7 * 86400.0
      
    Case #PB_Date_Month
      Mois  = Month(DateOriginale) - Compensation
      Annee = Year(DateOriginale)
      Jour  = Day(DateOriginale)
      Heure = Hour(DateOriginale)
      Minute = Minute(DateOriginale)
      Seconde = Second(DateOriginale)
      
      While Mois < 1
        Mois + 12
        Annee - 1
      Wend
      While Mois > 12
        Mois - 12
        Annee + 1
      Wend
      
      If Jour > Day(Date(Annee, Mois, 1, 0, 0, 0))
        Jour = Day(Date(Annee, Mois, 1, 0, 0, 0))
      EndIf
      
      NouvelleDate = Date(Annee, Mois, Jour, Heure, Minute, Seconde)
      
    Case #PB_Date_Year
      Annee = Year(DateOriginale) - Compensation
      Mois  = Month(DateOriginale)
      Jour  = Day(DateOriginale)
      Heure = Hour(DateOriginale)
      Minute = Minute(DateOriginale)
      Seconde = Second(DateOriginale)
      
      ; Corriger le jour si l'année cible n'est pas bissextile
      If Mois = 2 And Jour = 29 And Not (Annee % 4 = 0 And (Annee % 100 <> 0 Or Annee % 400 = 0))
        Jour = 28
      EndIf
      
      If Jour > Day(Date(Annee, Mois, Day(Date()), 0, 0, 0))
        Jour = Day(Date(Annee, Mois, Day(Date()), 0, 0, 0))
      EndIf
      
      NouvelleDate = Date(Annee, Mois, Jour, Heure, Minute, Seconde)
      
    Default
      Debug "Champ non reconnu"
      NouvelleDate = DateOriginale
  EndSelect
  
  ProcedureReturn NouvelleDate
EndProcedure
;DatePassee = CalculerDatePassee(Date(), 1, #PB_Date_Year)
;Debug FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", DatePassee)
Procedure.i EstDateValide(Jour.i, Mois.i, Annee.i)
  Protected JourValide = #True
  Protected MoisValide = #True
  Protected AnneeValide = #True
  
  ; Vérification des bornes
  If Jour < 1 Or Jour > 31
    JourValide = #False
  EndIf
  
  If Mois < 1 Or Mois > 12
    MoisValide = #False
  EndIf
  
  If Annee < 1900 Or Annee > 2200
    AnneeValide = #False
  EndIf
  
  ; Vérification des jours selon le mois
  If MoisValide And JourValide
    Select Mois
      Case 2
        If Jour > 29
          JourValide = #False
        ElseIf Jour = 29
          If Not (Annee % 4 = 0 And (Annee % 100 <> 0 Or Annee % 400 = 0)) Or Annee = 3600
            JourValide = #False
          EndIf
        EndIf
      Case 4, 6, 9, 11
        If Jour = 31
          JourValide = #False
        EndIf
    EndSelect
  EndIf
  
  ; Retourne 1 si tout est valide, 0 sinon
  ProcedureReturn Bool(JourValide And MoisValide And AnneeValide)
EndProcedure
;If EstDateValide(29, 2, 2028)
;  Debug "Date valide"
;Else
;  MessageRequester("Erreur", "Date invalide", #PB_MessageRequester_Error)
;EndIf
;- Fêtes chrétiennes
Procedure.q DatePaques(Annee.q=0)
  ; Retourne la date du dimanche de Pâques pour l'année donnée (valable jusqu'à 4099)
  ; S'il n'y a aucun argument, l'année en cours est utilisée
  ; Si l'argument est > 9999, c'est supposé être une date, pas une année
  ; Définition:
  ;   DimanchePaques est le premier dimanche après la date de la
  ;   pleine lune estimée se produisant le 21 Mars ou après.
  ;   Les dates possibles vont donc, du 22 Mars au 25 avril
  Protected FirstDig, Reste19, temp, d ; résultats intermediaires
  Protected tA, tB, tC, tD, tE         ; Résultats table A à E
  If Annee<=0
    Annee = Year(Date()) ; Cette année
  ElseIf Annee>9999
    Annee = Year(Date()) ; Convertir date à l'année
  EndIf
  FirstDig = Annee / 100 ; Siècle
  Reste19 = Annee%19     ; Nombre d'or de l'année dans le cycle métonique
                         ; Calculer Date de la pleine lune pascale du jour de mars (PFM)
  temp = (FirstDig - 15) / 2 + 202 - 11 * Reste19
  Select FirstDig
    Case 21, 24, 25, 27 To 32, 34, 35, 38
      temp = temp - 1
    Case 33, 36, 37, 39, 40
      temp = temp - 2
  EndSelect
  temp = Mod(temp, 30)
  tA = temp + 21
  If temp=29
    tA - 1
  EndIf
  If (temp=28 And Reste19>10)
    tA - 1
  EndIf
  ; Trouver le dimanche suivant
  tB = (tA - 19)%7
  tC = (40 - FirstDig)%4
  If tC=3
    tC + 1
  EndIf
  If tC>1
    tC + 1
  EndIf
  temp = Annee%100
  tD = (temp + temp / 4)%7
  tE = ((20 - tB - tC - tD)%7) + 1
  d = tA + tE ; Jours après le 0 Mars
  ProcedureReturn AjouterDate(Date(Annee, 3, 1, 0, 0, 0), #PB_Date_Day, d-1)
EndProcedure
;Debug FormaterDate(DatePaques())
Procedure.q Paques(annee.l = -1)	
  If annee = -1
    annee = Year(Date())
  EndIf
  
  Define datePaques.q = DatePaques(annee)
  
  ProcedureReturn datePaques
EndProcedure
;Debug FormaterDate(Paques())
;Debug "Pâques : " + FormaterDateFr(Paques())
Procedure Mardi_Gras(annee.l = -1)	
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -47)
EndProcedure
;Debug FormaterDate(Mardi_Gras())
Procedure Cendres(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -46)
EndProcedure
;Debug FormaterDate(Cendres())
Procedure Passion(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -14)
EndProcedure
;Debug FormaterDate(Passion())
Procedure Rameaux(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -7)
EndProcedure
;Debug FormaterDate(Rameaux())
Procedure Jeudi_Saint(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -3)
EndProcedure
;Debug FormaterDate(Jeudi_Saint())
Procedure Vendredi_Saint(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -2)
EndProcedure
;Debug FormaterDate(Vendredi_Saint())
Procedure Samedi_Saint(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, -1)
EndProcedure
;Debug FormaterDate(Samedi_Saint())
Procedure Paques_Lundi(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, 1)
EndProcedure
;Debug FormaterDate(Paques_Lundi())
Procedure.q Ascension(annee.l = -1)	
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, 39)	
EndProcedure
;Debug FormaterDate(Ascension())
Procedure.q Pentecote(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Week, 7)
EndProcedure
;Debug FormaterDate(Pentecote())
Procedure.q PentecoteLundi(annee.l = -1)	
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, 50)	
EndProcedure
;Debug FormaterDate(PentecoteLundi())
Procedure.q Trinite(annee.l = -1)
  ProcedureReturn AjouterDate(Paques(annee), #PB_Date_Day, 56)
EndProcedure
;Debug FormaterDate(Trinite())
Procedure.q PremierDimanche_Avent(annee.l = -1)
  If annee = -1 
    annee = Year(Date())
  EndIf
  
  Protected.q dateNoel = Date(annee, 12, 25, 0, 0, 0)
  Protected.q dateAvent = dateNoel - (JourDeSemaine(dateNoel) + 28) * 86400
  
  ProcedureReturn dateAvent
EndProcedure  
;Debug FormaterDate(PremierDimanche_Avent())
Procedure.q DeuxiemeDimanche_Avent(annee.l = -1)
  If annee = -1
    annee = Year(Date())
  EndIf
  
  Protected.q premierDimanche = PremierDimanche_Avent(annee)
  Protected.q deuxiemeDimanche = premierDimanche + 7 * 86400
  
  ProcedureReturn deuxiemeDimanche
EndProcedure
;Debug FormaterDate(DeuxiemeDimanche_Avent())
Procedure.q TroisiemeDimanche_Avent(annee.l = -1)
  If annee = -1
    annee = Year(Date())
  EndIf
  
  Protected.q premierDimanche = PremierDimanche_Avent(annee)
  Protected.q troisiemeDimanche = premierDimanche + 14 * 86400
  
  ProcedureReturn troisiemeDimanche
EndProcedure
;Debug FormaterDate(TroisiemeDimanche_Avent())
Procedure.q QuatriemeDimanche_Avent(annee.l = -1)
  If annee = -1
    annee = Year(Date())
  EndIf
  
  Protected.q premierDimanche = PremierDimanche_Avent(annee)
  Protected.q quatriemeDimanche = premierDimanche + 21 * 86400
  
  ProcedureReturn quatriemeDimanche
EndProcedure
;Debug FormaterDate(QuatriemeDimanche_Avent())
;- Fêtes fixes
Procedure.q NouvelAn(annee.l = -1)	
  If annee = -1 
    annee = Year(Date())
  EndIf	
  ProcedureReturn Date(annee, 1, 1, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(NouvelAn())
Procedure.q FeteDuTravail(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf 	
  ProcedureReturn Date(annee, 5, 1, 0, 0, 0)	
EndProcedure 
;Debug FormaterDate(FeteDuTravail())
Procedure.q Victoire1945(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf	
  ProcedureReturn Date(annee, 5, 8, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(Victoire1945())
Procedure.q FeteNationale(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf	
  ProcedureReturn Date(annee, 7, 14, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(FeteNationale())
Procedure.q Assomption(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf	
  ProcedureReturn Date(annee, 8, 15, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(Assomption())
Procedure.q Toussaint(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf	
  ProcedureReturn Date(annee, 11, 1, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(Toussaint())
Procedure.q Armistice(annee.l = -1)	
  If annee = -1 
    annee = Year(Date()) 
  EndIf	
  ProcedureReturn Date(annee, 11, 11, 0, 0, 0)	
EndProcedure
;Debug FormaterDate(Armistice())
;-Fêtes familliales
Procedure.q Fete_des_grand_meres(annee = -1)
  If Annee = -1
    Annee = Year(Date())
  EndIf  
  Protected Mois = 3, Jour=1,
            DatePremierDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le premier dimanche
  While JourDeSemaine(DatePremierDimanche)<>0
    
    jour + 1
    DatePremierDimanche= Date(annee, mois, jour, 0, 0, 0)
  Wend
  ProcedureReturn DatePremierDimanche
EndProcedure
;Debug FormaterDate(Fete_des_grand_meres())
Procedure.q Fete_des_meres(annee.l = -1)
  If Annee = -1
    Annee = Year(Date())
  EndIf 
  Protected Mois = 5, Jour=31,
            DateDernierDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le dernier dimanche
  While JourDeSemaine(DateDernierDimanche)<>0
    
    jour - 1
    DateDernierDimanche= Date(annee, mois, jour, 0, 0, 0)
  Wend
  
  If JourDeSemaine(DateDernierDimanche) = DayOfYear(Pentecote(annee))
    DateDernierDimanche = AjouterDate(DateDernierDimanche, #PB_Date_Day, 7)
  EndIf
  
  ProcedureReturn DateDernierDimanche	
  
EndProcedure
;Debug FormaterDate(Fete_des_grand_meres())
;Debug "Fête des mères : " + FormaterDateFr(Fete_des_meres())
Procedure.q Fete_des_peres(annee = -1)
  If Annee = -1
    Annee = Year(Date())
  EndIf 
  Protected Mois = 6, Jour=21,
            DateTroisiemeDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le troisième dimanche
  While JourDeSemaine(DateTroisiemeDimanche)<>0
    
    jour - 1
    DateTroisiemeDimanche= Date(annee, mois, jour, 0, 0, 0)
  Wend
  ProcedureReturn DateTroisiemeDimanche
  
  ProcedureReturn AjouterDate(NouvelAn(annee)-1, #PB_Date_Day, DayOfYear(Paques(annee)-DayOfYear(Fete_des_peres(annee))))
  
EndProcedure
;Debug FormaterDate(Fete_des_peres())
Procedure.q Fete_des_grand_peres(annee= -1)
  If Annee = -1
    Annee = Year(Date())
  EndIf 
  
  Protected Mois = 10, Jour=1,
            DatePremierDimanche=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le premier dimanche
  While JourDeSemaine(DatePremierDimanche)<>0
    
    jour + 1
    DatePremierDimanche= Date(annee, mois, jour, 0, 0, 0)
  Wend
  ProcedureReturn DatePremierDimanche
  
  ProcedureReturn AjouterDate(NouvelAn(annee)-1, #PB_Date_Day, DayOfYear(Paques(annee)-DayOfYear(Fete_des_grand_peres(annee))))
  
EndProcedure
;Debug FormaterDate(Fete_des_grand_peres())
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Répondre