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)