Module DateQ perfectionné

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

Module DateQ perfectionné

Message par Micoute »

Bonjour à tous,
comme j'aime bien compter le temps qui passe, je me suis inspiré de différents modules récoltés par-ci, par-là sur différents forums, j'ai donc décidé de m'en faire un pour moi, comme je le trouve très utile, j'en profite pour vous l'offrir à vous tous à qui je dois beaucoup.

DECLARATION DU MODULE

Code : Tout sélectionner

; Description: fonctions de date avec chiffres quad (Années 0000-9999)
EnableExplicit
DeclareModule DateQ
  ;{ Enumération
  Enumeration
    #Date_AnneeQ
    #Date_MoisQ
    #Date_SemaineQ
    #Date_JourQ
    #Date_HeureQ
    #Date_MinuteQ
    #Date_SecondeQ
  EndEnumeration
  ;}  
  ;{ 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 StrucSaisons
    Printemps.i[22]
    Ete.i[22]
    Automne.i[22]
    Hiver.i[22]
  EndStructure
  
  Structure StrucSoleil
    Lever$
    Coucher$
  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, *Soleil.StrucSoleil=AllocateStructure(StrucSoleil), *J_Saison.StrucSaisons=AllocateStructure(StrucSaisons)  
  Global NewMap Fetes_Journalieres.sFetes()
  Global.s Lever$,Coucher$, Fete$, Date$
  Global J_Printemps,J_Ete,J_Automne,J_Hiver
  Global Dim  TabNomJour$(6), Dim TabNomMois$(11)
  TabNomJour$(0) = "dimanche":TabNomJour$(1) = "lundi   ":TabNomJour$(2) = "mardi   ":TabNomJour$(3) = "mercredi"
  TabNomJour$(4) = "jeudi   ":TabNomJour$(5) = "vendredi":TabNomJour$(6) = "samedi  "
  TabNomMois$(0) = "janvier  ":TabNomMois$(1) = "février  ":TabNomMois$(2) = "mars     ":TabNomMois$(3) = "avril    ":TabNomMois$(4)  = "mai      ":TabNomMois$(5)  = "juin     "
  TabNomMois$(6) = "juillet  ":TabNomMois$(7) = "août     ":TabNomMois$(8) = "septembre":TabNomMois$(9) = "octobre  ":TabNomMois$(10) = "novembre ":TabNomMois$(11) = "décembre "
  ;}
  ;{ Section de données : dates des saisons de 2016 à 2037 et fêtes à souhaite
  DataSection
    Printemps:
    Data.s "20/03/2016","20/03/2017","20/03/2018","20/03/2019",
           "20/03/2020","20/03/2021","20/03/2022","20/03/2023",
           "20/03/2024","20/03/2025","20/03/2026","20/03/2027",
           "20/03/2028","20/03/2029","20/03/2030","20/03/2031",
           "20/03/2032","20/03/2033","20/03/2034","20/03/2035",
           "20/03/2036","20/03/2037"
    Ete:
    Data.s "21/06/2016","21/06/2017","21/06/2018","21/06/2019",
           "20/06/2020","21/06/2021","21/06/2022","21/06/2023",
           "20/06/2024","21/06/2025","21/06/2026","21/06/2027",
           "20/06/2028","21/06/2029","21/06/2030","21/06/2031",
           "20/06/2032","21/06/2033","21/06/2034","21/06/2035",
           "20/06/2036","21/06/2037"
    Automne:
    Data.s "22/09/2016","22/09/2017","23/09/2018","23/09/2019",
           "22/09/2020","22/09/2021","23/09/2022","23/09/2023",
           "22/09/2024","22/09/2025","23/09/2026","23/09/2027",
           "22/09/2028","22/09/2029","23/09/2030","23/09/2031",
           "22/09/2032","22/09/2033","23/09/2034","23/09/2035",
           "22/09/2036","22/09/2037"
    Hiver:
    Data.s "21/12/2016","21/12/2017","21/12/2018","22/12/2019",
           "21/12/2020","21/12/2021","21/12/2022","22/12/2023",
           "21/12/2024","21/12/2025","21/12/2026","22/12/2027",
           "21/12/2029","21/12/2029","21/12/2030","22/12/2031",
           "21/12/2032","21/12/2033","21/12/2034","22/12/2035",
           "21/12/2036","21/12/2037"
  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 / Régis","16/06"
  Data.s "Hervé","17/06","Léonce","18/06","Romuald","19/06","Silvère","20/06","Héraclide / 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 / 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","Thibault","08/07","Amandine","09/07","Ulrich","10/07","Benoît","11/07"
  Data.s "Olivier","12/07","Henri / 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 / 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 / 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 / Damien","26/09"
  Data.s "Vincent de Paul","27/09","Venceslas","28/09","Michel / Gabriel / 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 / 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
  ;}
  ;{ Déclaration des procédures
  Declare SiAnneeBissextileQ(Annee.q) ;Indique si l'année donnée est bissextile  
  Declare.b SiBissextile(Annee=-1)
  Declare JoursDansMoisQ(Annee, Mois) ;Retoure le nombre de jours dans le mois donné
  Declare.q DateQ()                   ;Retourne le nombre de secondes écoulées depuis le 1er Janvier 0001
  Declare.q DateQ2(Annee, Mois, Jour, Heure = 0, Minute = 0, Seconde = 0) ;Retourne la date julienne de la date donnée
  Declare.b SecondeQ(Date.q)                                              ;Retourne la valeur de la seconde de la date spécifiée (entre 0 et 59).
  Declare.b MinuteQ(Date.q)                                               ;Retourne la valeur de la minute de la date spécifiée (entre 0 et 59).
  Declare.b HeureQ(Date.q)                                                ;Retourne la valeur de l'heure de la date spécifiée (entre 0 et 23).
  Declare.b JourQ(Date.q)                                                 ;Retourne la valeur du jour de la date spécifiée (entre 1 et 31).
  Declare.b MoisQ(Date.q)                                                 ;Retourne la valeur du mois de la date spécifiée (entre 1 et 12).
  Declare.w AnneeQ(Date.q)                                                ;Retourne la valeur de l'année de la date spécifiée (entre 0 et 9999).
  Declare.w JourDAnneeQ(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).
  Declare.b JourDeSemaineQ(Date.q)                                        ;Renvoie la valeur du jour dans la semaine de la date spécifiée (0 = dimanche, 6 = samedi).
  Declare.q AjouterDateQ(Date.q, Champ.b, Compensation.q)                 ;Retourne une nouvelle date.
  Declare.s FormatDateQ(Masque.s, Date.q)                                 ;Retourne une représentation de chaîne de la date, selon le masque spécifié
  Declare.q AnalyserDateQ(masque.s, Date.s) ;Retourne une représentation de chaîne de la date, selon le masque spécifié
  Declare.s NomMoisQ(Date.q)                                              ;Retourne le nom du mois donné.
  Declare.s NomJourSemaineQ(Date.q)                                       ;Retourne le nom du jour de la semaine de la date donnée.
  Declare.i SemaineDAnneeQ(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.
  Declare.i DateSemaine1Q(Annee=-1, Premier_Jour=0)                       ;Renvoie la première date de janvier de la semaine
  Declare.q AujourdhuiQ()                                                 ;Renvoie la date actuelle
  Declare.q Aujourdhui_0Q()                                               ;Renvoie la date actuelle à minuit
  Declare.q NbreJoursRestantsMois()                                       ;Renvoie le nombre de jours pour finir le mois en cours
  Declare.q NbreJoursRestantsAnnee()                                      ;Renvoie le nombre de jours pour finir l'année en cours
  Declare.q DiffDatesQ(datedebut.q, datefin.q=-1, Unite=#Date_JourQ, multiple.q=1)	; Différence entre deux dates
  Declare.q DateDiffQ(dateAvant,dateApres,*diff.sDiffTemps)                         ;Calcule la difference entre 2 dates en années, mois, jours, heures, minutes et secondes
  Declare.s AjouterUniteTemps(nombre.q, unite.q)
  Declare.s DiffTempsQ(Secondes.q) 
  Declare.s Premier_Ouvre_Mois(Annee,Mois)
  Declare   ChercherVendredi13(Annee,Mois)
  
  Declare.q DatePaques(Annee.q=0)  ; Retourne la date du dimanche de Pâques pour l'année donnée (valable jusqu'à 4099)
  Declare.q Paques(annee.l = -1)	
  Declare Mardi_Gras(annee.l = -1)	
  Declare Cendres(annee.l = -1)
  Declare Passion(annee.l = -1)
  Declare Rameaux(annee.l = -1)
  Declare Jeudi_Saint(annee.l = -1)
  Declare Vendredi_Saint(annee.l = -1)
  Declare.q PaquesLundi(annee.l = -1)	
  Declare.q Ascension(annee.l = -1)	
  Declare.q Pentecote(annee.l = -1)
  Declare.q PentecoteLundi(annee.l = -1)	
  Declare.q Trinite(annee.l = -1)
  Declare.q NouvelAn(annee.l = -1)	
  Declare.q FeteDuTravail(annee.l = -1)	
  Declare.q Victoire1945(annee.l = -1)	
  Declare.q FeteNationale(annee.l = -1)	
  Declare.q Assomption(annee.l = -1)	
  Declare.q Toussaint(annee.l = -1)	
  Declare.q Armistice(annee.l = -1)
  Declare.q PremierDimanche_Avent(annee.l = - 1)
  Declare.q DeuxiemeDimanche_Avent(annee.l = - 1)
  Declare.q TroisiemeDimanche_Avent(annee.l = - 1)
  Declare.q Quatrieme_Dimanche_Avent(annee.l = -1)
  Declare.q Noel(annee.l = -1)	
  Declare.q Saint_Sylvestre(annee.l = -1)
  Declare.q Fete_des_grand_meres(annee = -1)
  Declare.q Fete_des_meres(annee.l = -1)
  Declare.q Fete_des_peres(annee = -1)
  Declare.q Fete_des_grand_peres(annee= -1)
  Declare CalculerSoleil(lat.f,lon.f,JA,tz.d)  
  Declare.s Lever_Soleil(lat.f,lon.f,JA)
  Declare.s Coucher_Soleil(lat.f,lon.f,JA)
  Declare.i DecalageHoraire(type) ; Retourne l'heure de la zone d'information de polarisation
  Declare.s ZoneFuseau()          ; Retourne le nom du fuseau horaire
  
  Declare.b JoursDansMois(Annee=-1,Mois=-1)
  Declare TrouverPremierDimanche(Annee,Mois)
  Declare TrouverDeuxiemeDimanche(Annee,Mois)
  Declare TrouverTroisiemeDimanche(Annee,Mois)
  Declare TrouverQuatriemeDimanche(Annee,Mois)
  Declare TrouverDernierDimanche(Annee,Mois)
  Declare$ SigneAstro(Jour,Mois);Permet de déterminer le signe astrologique correspondant au jour et au mois donnés
  Declare$ Element_Astro(Jour, Mois)
  Declare$ Saison(nJour,nMois);Permet de déterminer la saison correspondant au jour et au mois donnés
  Declare Heure_d_ete(Annee=-1)
  Declare Heure_d_hiver(Annee=-1)
  
  Declare.s Calculer_Age(A_avant, M_avant, J_avant, A_apres, M_apres, J_apres)
  Declare Anniversaire_Dans(AnneeNaissance, MoisNaissance, JourNaissance)
  Declare Calculer_Date_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
  Declare.s Decomposer_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
  ;}
  ;{ Saisons
Global Z, *Saison.StrucSaisons=AllocateStructure(StrucSaisons)
Global.s Date_Printemps,Date_Ete,Date_Automne,Date_Hiver
Restore Printemps
For Z = 0 To 21
  Read.s Date_Printemps
  *Saison\Printemps[Z] = AnalyserDateQ("%dd/%mm/%yyyy",Date_Printemps)
  *J_Saison\Printemps[Z]=JourDAnneeQ(*Saison\Printemps[Z])
Next Z
Restore Ete
For Z = 0 To 21
  Read.s Date_Ete
  *Saison\Ete[Z]=AnalyserDateQ("%dd/%mm/%yyyy",Date_Ete)
  *J_Saison\Ete[Z]=JourDAnneeQ(*Saison\Ete[Z])
Next Z
Restore Automne
For Z = 0 To 21
  Read.s Date_Automne
  *Saison\Automne[Z]=AnalyserDateQ("%dd/%mm/%yyyy",Date_Automne)
  *J_Saison\Automne[Z]=JourDAnneeQ(*Saison\Automne[Z])
Next Z
Restore Hiver
For Z = 0 To 21
  Read.s Date_Hiver
  *Saison\Hiver[Z]=AnalyserDateQ("%dd/%mm/%yyyy",Date_Hiver)
  *J_Saison\Hiver[Z]=JourDAnneeQ(*Saison\Hiver[Z])
Next Z
;}
;{ Fêtes à souhaiter
Restore fetes
For z = 0 To 365
  Read$ Fete$
  Read$ Date$
  AddMapElement(Fetes_Journalieres(), Str(z))
  
  Fetes_Journalieres()\Index = z
  Fetes_Journalieres()\Fete = Fete$
  Fetes_Journalieres()\Date = Date$
Next z
;}
EndDeclareModule
/code-pb]
Dernière modification par Micoute le dim. 15/oct./2023 13:11, modifié 1 fois.
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 : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module DateQ perfectionné

Message par Micoute »

PROCEDURES

Code : Tout sélectionner

Module DateQ
  Procedure.q AnalyserDateQ(Masque.s, Date.s) ;Retourne la date julienne de la date donnée
    Protected Annee = 0, Mois = 0, Jour = 0, Heure = 0, Minute = 0, Seconde = 0
    Annee = Val(Mid(Date, 7, 4))
    Mois = Val(Mid(Date, 4, 2))
    Jour = Val(Left(Date, 2))
    Heure = Val(Mid(Date, 12, 2))
    Minute = Val(Mid(Date, 15, 2))
    Seconde = Val(Mid(Date, 18, 2))
    ProcedureReturn DateQ2(Annee, Mois, Jour, Heure, Minute, Seconde)
  EndProcedure
  Procedure SiAnneeBissextileQ(Annee.q) ;Indique si l'année donnée est bissextile
    If ((Annee % 4) = 0)
      If (Annee % 100) Or ((Annee % 400) = 0)
        ProcedureReturn #True
      EndIf
    EndIf
  EndProcedure
  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)
    ;Le calendrier iranien est basé sur 8 jours bissextiles tous les 33ans (365,242424 jours)
    ;dictionary.die.net/leap%20year
    ;en.wikipedia.org/wiki/Leap_year
    If Annee<=0
      Annee=AnneeQ(DateQ())
    EndIf;Cetteannée
    If(Mod(Annee,4)=0 And Mod(Annee,100)<>0)Or(Mod(Annee,400)=0)
      ProcedureReturn #True
    EndIf
    ProcedureReturn #False
  EndProcedure
  Procedure JoursDansMoisQ(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 + SiAnneeBissextileQ(Annee)
    EndSelect
  EndProcedure
  Procedure.q DateQ() ;Retourne le nombre de secondes écoulées depuis le 1er Janvier 0001
    Protected Temps.Temps
    GetLocalTime_(Temps)
    ProcedureReturn DateQ2(Temps\Annee, Temps\Mois, Temps\Jour, Temps\Heure, Temps\Minute, Temps\Seconde)
  EndProcedure
  Procedure.q DateQ2(Annee, Mois, Jour, Heure = 0, Minute = 0, Seconde = 0) ;Retourne la date julienne de la date donnée
    Protected sec.q, i.w, Jours.b
    If (Annee < 1) Or (Annee > 9999) Or 
       (Mois < 1) Or (Mois > 12) Or 
       (Jour < 1) Or 
       (Heure < 0) Or (Heure > 23) Or 
       (Minute < 0) Or (Minute > 59) Or 
       (Seconde < 0) Or (Seconde > 59)
      ProcedureReturn -1
    EndIf
    If (Jour > JoursDansMoisQ(Annee, Mois))
      ProcedureReturn -1
    EndIf
    sec = (Annee-1)*365*24*60*60
    For i = 4 To (Annee-1) Step 4
      If SiAnneeBissextileQ(i)
        sec + 24*60*60
      EndIf
    Next
    For i = 1 To Mois-1
      Jours = JoursDansMoisQ(Annee, i)
      sec + Jours*24*60*60
    Next
    sec + (Jour-1)*24*60*60
    sec + Heure*60*60
    sec + Minute*60
    sec + Seconde
    ProcedureReturn sec
  EndProcedure
  Procedure.b SecondeQ(Date.q) ;Retourne la valeur de la seconde de la date spécifiée (entre 0 et 59).
    Protected Seconde.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Seconde = Date % 60
    ProcedureReturn Seconde
  EndProcedure
  Procedure.b MinuteQ(Date.q) ;Retourne la valeur de la minute de la date spécifiée (entre 0 et 59).
    Protected minute.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    minute = (Date % (60*60)) / 60
    ProcedureReturn minute
  EndProcedure
  Procedure.b HeureQ(Date.q) ;Retourne la valeur de l'heure de la date spécifiée (entre 0 et 23).
    Protected Heure.b
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Heure = (Date % (24*60*60)) / (60*60)
    ProcedureReturn Heure
  EndProcedure
  Procedure.b JourQ(Date.q) ;Retourne la valeur du jour de la date spécifiée (entre 1 et 31).
    Protected Annee.w, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Date = DateBis
    Mois = 0
    Repeat
      DateBis = Date
      Jours = JoursDansMoisQ(Annee, Mois + 1)
      Date - Jours*24*60*60
      Mois + 1
    Until (Date < 0)
    Jours = Round(DateBis/24/60/60, 0) + 1
    ProcedureReturn Jours
  EndProcedure
  Procedure.b MoisQ(Date.q) ;Retourne la valeur du mois de la date spécifiée (entre 1 et 12).
    Protected Annee.w, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Date = DateBis
    Mois = 0
    Repeat
      Jours = JoursDansMoisQ(Annee, Mois + 1)
      Date - Jours*24*60*60
      Mois + 1
    Until (Date < 0)
    ProcedureReturn Mois
  EndProcedure
  Procedure.w AnneeQ(Date.q) ;Retourne la valeur de l'année de la date spécifiée (entre 0 et 9999).
    Protected Annee.w, Jours.w
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    ProcedureReturn Annee
  EndProcedure
  Procedure.w JourDAnneeQ(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, Mois.b, Jours.w, DateBis.q
    If (Date < 0)
      ProcedureReturn 0
    EndIf
    Repeat
      DateBis = Date
      Jours = 365+SiAnneeBissextileQ(Annee + 1)
      Date - Jours*24*60*60
      Annee + 1
    Until (Date < 0)
    Jours = Round(DateBis/24/60/60, 0) + 1
    ProcedureReturn Jours
  EndProcedure
  Procedure.b JourDeSemaineQ(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/24/60/60
    Jours + 1
    joursemaine = Jours % 7
    ProcedureReturn joursemaine
  EndProcedure
  Procedure.q AjouterDateQ(Date.q, Champ.b, Compensation.q) ;Retourne une nouvelle date.
    Protected Mois.b, Annee.w
    If (Date < 0)
      ProcedureReturn Date
    EndIf
    If (Champ = #Date_SecondeQ)
      Date + Compensation
    ElseIf (Champ = #Date_MinuteQ)
      Date + Compensation * 60
    ElseIf (Champ = #Date_HeureQ)
      Date + Compensation * 60 * 60
    ElseIf (Champ = #Date_JourQ)
      Date + Compensation * 24 * 60 * 60
    ElseIf (Champ = #Date_SemaineQ)
      Date + Compensation * 7 * 24 * 60 * 60
    ElseIf (Champ = #Date_MoisQ)
      Mois = MoisQ(Date) + Compensation * 1
      Annee = AnneeQ(Date)
      While (Mois < 1)
        Mois + 12
        Annee - 1
      Wend
      While (Mois > 12)
        Mois - 12
        Annee + 1
      Wend
      Date = DateQ2(Annee, Mois, JourQ(Date), HeureQ(Date), MinuteQ(Date), SecondeQ(Date))
    ElseIf (Champ = #Date_AnneeQ)
      Date = DateQ2(AnneeQ(Date) + Compensation * 1, MoisQ(Date), JourQ(Date), HeureQ(Date), MinuteQ(Date), SecondeQ(Date))
    EndIf 
    ProcedureReturn Date
  EndProcedure
  Procedure.s FormatDateQ(Masque.s, Date.q) ;Retourne une représentation de chaîne de la date, selon le masque spécifié
    Protected Annee.s
    Annee = Str(AnneeQ(Date))
    Masque = ReplaceString(Masque, "%yyyy", RSet(Annee,4,"0"))
    Masque = ReplaceString(Masque, "%aaaa", RSet(Annee,4,"0"))
    Masque = ReplaceString(Masque, "%yy", Right(RSet(Annee,4,"0"),2))
    Masque = ReplaceString(Masque, "%aa", Right(RSet(Annee,4,"0"),2))
    Masque = ReplaceString(Masque, "%mm", RSet(Str(MoisQ (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%dd", RSet(Str(JourQ   (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%jj", RSet(Str(JourQ   (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%hh", RSet(Str(HeureQ  (Date)),2,"0"))
    Masque = ReplaceString(Masque, "%ii", RSet(Str(MinuteQ(Date)),2,"0"))
    Masque = ReplaceString(Masque, "%ss", RSet(Str(SecondeQ(Date)),2,"0"))
    ProcedureReturn Masque
  EndProcedure
  Procedure.s NomMoisQ(Date.q) ;Retourne le nom du mois donné.
    Protected M = MoisQ(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
  Procedure.s NomJourSemaineQ(Date.q) ;Retourne le nom du jour de la semaine de la date donnée.
    Protected J = JourDeSemaineQ(Date.q)
    Protected NomJours.s = "dimanche,lundi,mardi,mercredi,jeudi,vendredi,samedi"
    ProcedureReturn StringField(NomJours, J + 1, ",")
  EndProcedure
  Procedure.i SemaineDAnneeQ(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 jandate ; Date en janvier au début de la semaine 1
    If date<0
      date = DateQ()
    EndIf ; Maintenant
    jandate = DateSemaine1Q(AnneeQ(date), Premier_Jour)
    ProcedureReturn (JourDAnneeQ(date)-jandate)/7+1
  EndProcedure
  Procedure.i DateSemaine1Q(Annee=-1, Premier_Jour=0)
    ; Renvoie la première date de janvier de la semaine 1 de l'année donnée
    ;   Une date de retour <= 0 implique le mois de décembre précédent à la place:
    ;   -2=Dec29  -1=Dec30  0=Dec31
    ; La semaine 1 est la première semaine comportant au moins 4 jours dans l'année
    ;   Cela signifie que la première semaine comportera toujours le 4 janvier
    ;   qui est conforme à la norme ISO 8601 (& CalendarGadget)
    ;   mais peut-être pas avec le calendrier de la barre d'état du système Windows
    ;   comme (sous Windows ME au moins) le décalage est de 3 au lieu de 4
    ; L'argument 'Premier_Jour' identifie le "premier jour de chaque semaine"
    ;   Dimanche=0 .. Samedi=6
    ; Si l'année est absente, l'année en cours est utilisée
    Protected Decalage=4 ; La date de Janvier qui tombe toujours dans la semaine 1
    Protected Jourjan    ; Jour de la semaine de Janvier du décalage de date
    Protected jandate    ; Date de décembre/janvier du début de la semaine 1
    If Annee<=0
      Annee = DateQ()
    EndIf ; Cette année
    Jourjan = (DateQ2(Annee, 1, Decalage, 0, 0, 0))%7 ; Jour de la semaine
    jandate = Decalage+Premier_Jour-Jourjan
    If Premier_Jour>Jourjan
      jandate - 7
    EndIf
    ProcedureReturn jandate
  EndProcedure
  Procedure.q AujourdhuiQ() ;Retourne la date julienne de la date actuelle
    ProcedureReturn DateQ2(AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ()), HeureQ(DateQ()), MinuteQ(DateQ()), SecondeQ(DateQ()))
  EndProcedure
  Procedure.q Aujourdhui_0Q()
    ProcedureReturn DateQ2(AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ()))
  EndProcedure
  Procedure.q NbreJoursRestantsMois()
    Global Jour 
    jour = JoursDansMois(AnneeQ(DateQ()), MoisQ(DateQ())) - JourQ(DateQ())
    ProcedureReturn Jour
  EndProcedure
  Procedure.q NbreJoursRestantsAnnee()
    Global Jour = JourDAnneeQ(DateQ2(AnneeQ(DateQ()), 12, 31)) - JourDAnneeQ(DateQ())
    ProcedureReturn Jour
  EndProcedure
  Procedure.q DiffDatesQ(datedebut.q, datefin.q=-1, Unite=#Date_JourQ, multiple.q=1)
    ; Différence entre deux dates
    ; Calcule datefin-datedebut le résultat est retourné dans l'unité donnée [ou de son multiple]
    ; Si datefin est absente ou négatif, Aujourd_huiF est utilisé
    ; Retourne 0 en cas d'erreur
    ; Unité est une de:
    ;   #PB_Date_Year   = #Date_Annee   = 0
    ;   #PB_Date_Month  = #Date_Mois    = 1
    ;   #PB_Date_Week   = #Date_Semaine = 2
    ;   #PB_Date_Day    = #Date_Jour    = 3
    ;   #PB_Date_Hour   = #Date_Heure   = 4
    ;   #PB_Date_Minute = #Date_Minute  = 5
    ;   #PB_Date_Second = #Date_Seconde = 6
    ; Les exemples de l'utilisation de l'argument de multiples (>0) sont:-
    ;   La différence de date (qui peut être négative) est retournée dans:
    ;     Semaines si l'unité   = #PB_Date_Week  ou #Date_Semaine et multiple = 1 (par défaut)
    ;     Quinzaines si l'unité = #PB_Date_Week  ou #Date_Semaine et multiple = 2
    ;     Trimestres si l'unité = #PB_Date_Month ou #Date_Mois et multiple    = 3
    Protected signe=1, Secondes, diff.q, date.q
    If multiple <= 0
      ProcedureReturn 0
    EndIf ; Erreur
    If datefin<0
      datefin = DateQ()
    EndIf ; Aujourd_huiF
    If datedebut>datefin
      signe = -1
      Swap datedebut, datefin
    EndIf
    ; Obtenir la différence de date en secondes
    diff = datefin-datedebut
    If UniteDateF=1 ; Pour éviter les débordements quad
      diff = (diff+5000000)/10000000
    Else
      diff = (diff*#SecsParJourQ+UniteJourQ/2)/UniteJourQ
    EndIf
    Select Unite
      Case #Date_AnneeQ
        Secondes = 366*#SecsParJourQ
      Case #Date_MoisQ
        Secondes = 31*#SecsParJourQ
      Case #Date_SemaineQ
        Secondes = 7*#SecsParJourQ
      Case #Date_JourQ
        Secondes = 1*#SecsParJourQ
      Case #Date_HeureQ
        Secondes = 3600
      Case #Date_MinuteQ
        Secondes = 60
      Case #Date_SecondeQ
        Secondes = 1
      Default
        ProcedureReturn 0 ; Erreur
    EndSelect
    ; Obtenir une réponse approximative
    diff / (multiple * Secondes)
    ; Améliorer l'approximation
    date = AjouterDateQ(datedebut, Unite, multiple * diff)
    While date<datefin
      date = AjouterDateQ(date, Unite, multiple)
      diff + 1
    Wend
    ProcedureReturn signe*diff
  EndProcedure
  Procedure.q DateDiffQ(dateAvant,dateApres,*diff.sDiffTemps) ;Retourne la différence de date dans la structure sDiffTemps
    
    Protected.q TotalJours,Annees,Mois,JoursRestants,Heures,Minutes,Secondes,DateCourante,dateTest,jourDebut
    
    If dateAvant>dateApres
      Swap dateAvant,dateApres
    EndIf
    
    DateCourante=dateAvant
    dateTest=dateAvant
    jourDebut=JourQ(dateAvant)
    TotalJours=0
    JoursRestants=0
    
    While dateTest<=dateApres
      dateTest=AjouterDateQ(DateCourante,#Date_JourQ,1)
      If dateTest<=dateApres
        DateCourante=dateTest
        TotalJours+1
        JoursRestants+1
        If JourQ(DateCourante)=jourDebut
          Mois+1
          JoursRestants=0
        EndIf
      EndIf
    Wend
    
    dateTest=DateCourante
    Heures=0
    While dateTest<dateApres
      dateTest=AjouterDateQ(DateCourante,#Date_HeureQ,1)
      If dateTest<=dateApres
        DateCourante=dateTest
        Heures+1
      EndIf
    Wend
    
    dateTest=DateCourante
    Minutes=0
    While dateTest<dateApres
      dateTest=AjouterDateQ(DateCourante,#Date_MinuteQ,1)
      If dateTest<=dateApres
        DateCourante=dateTest
        Minutes+1
      EndIf
    Wend
    
    dateTest=DateCourante
    Secondes=0
    While dateTest<dateApres
      dateTest=AjouterDateQ(DateCourante,#Date_SecondeQ,1)
      If dateTest<=dateApres
        DateCourante=dateTest
        Secondes+1
      EndIf
    Wend
    
    Annees=Mois/12
    If Annees
      Mois % 12
    EndIf
    
    *diff\TotalJours=TotalJours
    *diff\Annees=Annees
    *diff\Mois=Mois
    *diff\JoursRestants=JoursRestants
    *diff\Heures=Heures
    *diff\Minutes=Minutes
    *diff\Secondes=Secondes
    
    *diff\sTotalJours=Str(TotalJours)
    If TotalJours = 0
      *diff\sTotalJours = "aujourd'hui"
    ElseIf TotalJours = 1  
      *diff\sTotalJours = "demain"
    ElseIf TotalJours > 1
      *diff\sTotalJours+" jours"
    EndIf
    *diff\sAnnees=Str(Annees)
    If Annee<2
      *diff\sAnnees+" an"
    Else
      *diff\sAnnees+" ans"
    EndIf
    *diff\sMois=Str(Mois)+" mois"
    *diff\sJoursRestants=Str(JoursRestants)
    If JoursRestants<2
      *diff\sJoursRestants+" jour"
    Else
      *diff\sJoursRestants+" jours"
    EndIf
    *diff\sHeures=Str(Heures)
    If Heures<2
      *diff\sHeures+" heure"
    Else
      *diff\sHeures+" heures"
    EndIf
    *diff\sMinutes=Str(Minutes)
    If Minutes<2
      *diff\sMinutes+" minute"
    Else
      *diff\sMinutes+" minutes"
    EndIf
    *diff\sSecondes=Str(Secondes)
    If Secondes<2
      *diff\sSecondes+" seconde"
    Else
      *diff\sSecondes+" secondes"
    EndIf
  EndProcedure
  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
  Procedure.s DiffTempsQ(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
  Procedure.s Premier_Ouvre_Mois(Annee,Mois) ;Retourne la date "Jds jj/mm/aaaa" du premier jour ouvré du mois et de l'année donnés.
    Protected Jour=1, Joursem
    Protected DatePremierJourOuvre.q=DateQ2(Annee,Mois,Jour,0,0,0)
    JourSem = JourDeSemaineQ(DateQ2(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=DateQ2(Annee,Mois,Jour,0,0,0)
          Case 6:Jour + 2:JourSem = 1
        EndSelect
    EndSelect
    DatePremierJourOuvre=DateQ2(Annee,Mois,Jour,0,0,0)
    
    ProcedureReturn TabNomJour$(JourDeSemaineQ(DatePremierJourOuvre)) + " "  + Jour + " " + TabNomMois$(Mois - 1) + " " + Annee
  EndProcedure
  Procedure ChercherVendredi13(Annee,Mois) ;Retourne la date "ds jj/mm/aaaa" du mois et de l'année donnés
    If Annee < 1
      Annee = AnneeQ(DateQ())
    EndIf  
    If Mois < 1
      Mois = MoisQ(DateQ())
    EndIf  
    Protected Jour=13
    Protected.q DateVendredi13=DateQ2(Annee,Mois,Jour)
    
    ;Cherche le vendredi 13
    While JourDeSemaineQ(DateVendredi13)<>5
      Jour+1
      DateVendredi13=DateQ2(Annee,Mois,Jour)
    Wend
    
    ProcedureReturn DateVendredi13
  EndProcedure
  ;{ Fêtes chrétiennes mobiles
  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:
    ;   www.merlyn.demon.co.uk/estrdate.htm
    ;   Dimanche Pâques 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
    ; Utilise la méthode 3 à:
    ;   users.sa.chariot.net.au/~gmarts/eastalg.htm
    Protected FirstDig, Reste19, temp, d ; résultats intermediaires
    Protected tA, tB, tC, tD, tE         ; Résultats table A à E
    If Annee<=0
      Annee = AnneeQ(Annee) ; Cette année
    ElseIf Annee>9999
      Annee = AnneeQ(Annee) ; 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 - 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 AjouterDateQ(DateQ2(Annee, 3, 1, 0, 0, 0), #Date_JourQ, d-1)
  EndProcedure
  Procedure.q Paques(annee.l = -1)	
    mois = 3 
    
    If annee = -1 
      annee = DateQ() 
    EndIf 
    
    jour = JourQ(DatePaques(annee))
    If jour < 21
      mois = 4
    EndIf  
    
    ProcedureReturn DateQ2(annee, mois, jour, 0, 0, 0)
  EndProcedure 
  Procedure Mardi_Gras(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -47)
  EndProcedure
  Procedure Cendres(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -46)
  EndProcedure
  Procedure Passion(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -14)
  EndProcedure
  Procedure Rameaux(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -7)
  EndProcedure
  Procedure Jeudi_Saint(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -3)
  EndProcedure
  Procedure Vendredi_Saint(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, -2)
  EndProcedure
  Procedure.q PaquesLundi(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 1)	
  EndProcedure 
  Procedure.q Ascension(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 39)	
  EndProcedure
  Procedure.q Pentecote(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_SemaineQ, 7) ;#Date_Jour,49)
  EndProcedure
  Procedure.q PentecoteLundi(annee.l = -1)	
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 50)	
  EndProcedure 
  Procedure.q Trinite(annee.l = -1)
    ProcedureReturn AjouterDateQ(Paques(annee), #Date_JourQ, 56)
  EndProcedure
  ;}
  ;{ Fêtes chrétiennes fixes
  Procedure.q NouvelAn(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 1, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q FeteDuTravail(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf 	
    ProcedureReturn DateQ2(annee, 5, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q Victoire1945(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 5, 8, 0, 0, 0)	
  EndProcedure
  Procedure.q FeteNationale(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 7, 14, 0, 0, 0)	
  EndProcedure 
  Procedure.q Assomption(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 8, 15, 0, 0, 0)	
  EndProcedure 
  Procedure.q Toussaint(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 11, 1, 0, 0, 0)	
  EndProcedure 
  Procedure.q Armistice(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 11, 11, 0, 0, 0)	
  EndProcedure 
  Procedure.q Noel(annee.l = -1)	
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 12, 25, 0, 0, 0)	
  EndProcedure
  Procedure.q PremierDimanche_Avent(annee.l = - 1)
    If annee = -1 
      annee = DateQ() 
    EndIf
    Protected.q DatePremierDimanche_Avent
    Select JourDeSemaineQ(Noel(annee))
      Case 0
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 27)
      Case 1
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 26)
      Case 2
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 25)
      Case 3
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 24)
      Case 4
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 23)
      Case 5
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 22)
      Case 6
        DatePremierDimanche_Avent = DateQ2(Annee, 11, 21)
    EndSelect    
    ProcedureReturn DatePremierDimanche_Avent
  EndProcedure
  Procedure.q DeuxiemeDimanche_Avent(annee.l = - 1)
    If annee = -1 
      annee = DateQ() 
    EndIf
    Protected.q DateDeuxiemeDimanche_Avent
    Select JourDeSemaineQ(Noel(annee))
      Case 0
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 04)
      Case 1
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 05)
      Case 2
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 06)
      Case 3
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 07)
      Case 4
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 08)
      Case 5
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 09)
      Case 6
        DateDeuxiemeDimanche_Avent = DateQ2(Annee, 12, 10)
    EndSelect    
    ProcedureReturn DateDeuxiemeDimanche_Avent
  EndProcedure
  Procedure.q TroisiemeDimanche_Avent(annee.l = - 1)
    If annee = -1 
      annee = DateQ() 
    EndIf
    Protected.q DateTroisiemeDimanche_Avent
    Select JourDeSemaineQ(Noel(annee))
      Case 0
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 11)
      Case 1
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 12)
      Case 2
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 13)
      Case 3
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 14)
      Case 4
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 15)
      Case 5
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 16)
      Case 6
        DateTroisiemeDimanche_Avent = DateQ2(Annee, 12, 17)  
    EndSelect    
    ProcedureReturn DateTroisiemeDimanche_Avent
  EndProcedure
  Procedure.q Quatrieme_Dimanche_Avent(annee.l = -1)
    Protected Jour = JourDeSemaineQ(Noel(annee))
    If annee = -1 
      annee = DateQ() 
    EndIf
    Protected.q DateQuatriemeDimanche_Avent
    Select JourDeSemaineQ(Noel(annee))
      Case 0
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 18)
      Case 1
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 19)
      Case 2
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 20)
      Case 3
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 21)
      Case 4
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 22)
      Case 5
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 23)
      Case 6
        DateQuatriemeDimanche_Avent = DateQ2(Annee, 12, 24)
    EndSelect
    ProcedureReturn DateQuatriemeDimanche_Avent
  EndProcedure
  Procedure.q Saint_Sylvestre(annee.l = -1)
    If annee = -1 
      annee = DateQ() 
    EndIf	
    ProcedureReturn DateQ2(annee, 12, 31, 0, 0, 0)	
  EndProcedure
  ;}
  ;{ Fêtes familiales
  Procedure.q Fete_des_grand_meres(annee = -1)
    Protected Mois = 3, Jour=1,
              DatePremierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le premier dimanche
    While JourDeSemaineQ(DatePremierDimanche)<>0
      
      jour + 1
      DatePremierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DatePremierDimanche
  EndProcedure
  Procedure.q Fete_des_meres(annee.l = -1)
    Protected Mois, Jour
    
    Mois = 5 : Jour=31
    Protected DateDernierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    DateDernierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le dernier dimanche
    While JourDeSemaineQ(DateDernierDimanche)<>0        
      jour - 1
      DateDernierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ;Si le dernier dimanche est égal au jour de Pentecôte
    If Pentecote(annee) = DateDernierDimanche
      Mois = 6 : Jour = 1
      Protected DatePremierDimanche
      ;On cher le premier dimanche du mois suivant
      DatePremierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
      While JourDeSemaineQ(DatePremierDimanche) <> 0
        Jour + 1
        DatePremierDimanche = DateQ2(annee, mois, jour, 0, 0, 0)
      Wend
      ProcedureReturn DatePremierDimanche
    Else
      ProcedureReturn DateDernierDimanche
    EndIf 
  EndProcedure
  Procedure.q Fete_des_peres(annee = -1)
    Protected Mois = 6, Jour=21,
              DateTroisiemeDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le troisième dimanche
    While JourDeSemaineQ(DateTroisiemeDimanche)<>0
      
      jour - 1
      DateTroisiemeDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DateTroisiemeDimanche
    
    ProcedureReturn AjouterDateQ(NouvelAn(annee)-1, #Date_JourQ, DayOfYear(Paques(annee)-DayOfYear(Fete_des_peres(annee))))
    
  EndProcedure
  Procedure.q Fete_des_grand_peres(annee= -1)
    
    Protected Mois = 10, Jour=1,
              DatePremierDimanche=DateQ2(Annee, Mois, Jour, 0, 0, 0)
    
    ;Cherche le premier dimanche
    While JourDeSemaineQ(DatePremierDimanche)<>0
      
      jour + 1
      DatePremierDimanche= DateQ2(annee, mois, jour, 0, 0, 0)
    Wend
    ProcedureReturn DatePremierDimanche
    
    ProcedureReturn AjouterDateQ(NouvelAn(annee)-1, #Date_JourQ, DayOfYear(Paques(annee)-DayOfYear(Fete_des_grand_peres(annee))))
    
  EndProcedure
  ;}
  Procedure CalculerSoleil(lat.f,lon.f,JA,tz.d)
  Define.d B,D,DiffJour,Jourglg,AMOZ,UMOZ,Lever,pi=3.1415927,h=-0.0145,Coucher
  ;lat=latitude(N/S), lon=longitude(E/O), JA=Jour de l'année,tz=décalage horaire de GMT pi=3.1415927<--utilise #PI de PureBasic
  ;Latitude: (Lignes Horizontales) Longitude: (Lignes Verticales)
  ;[Q]=Equateur=0.0000000 degré Latitude [P]=Premier Meridien=0.0000000 degré Longitude @Greenwich,England
  ;[N]=Hemisphere Nord (Valeurpositive,Nord de l'Equateur) [E]=Hemisphere Est (Valeurpositive, à l'Est du Premier Méridien)
  ;[S]=Hemisphere Sud(-Valeurnégative,Sud fr l'Equateur)[O]=Hemisphere Ouest(-Valeur négative,à l'Ouest du Premier Méridien)
  ;
  
  If JA=0
    JA=JourDAnneeQ(DateQ())
  EndIf
  
  B=Radian(lat)
  D=0.40954*Sin(0.0172*(JA-79.349740))
  DiffJour=12*ACos((Sin(h)-Sin(B)*Sin(D))/(Cos(B)*Cos(D)))/#PI
  Jourglg=-0.1752*Sin(0.033430*JA+0.5474)-0.1340*Sin(0.018234*JA-0.1939)
  
  ;~~~~~Lever
  AMOZ=12-DiffJour-Jourglg;
  Lever=AMOZ-lon/15+tz-(0)
  
  ;~~~~~Coucher
  UMOZ=12+DiffJour-Jourglg
  Coucher=(UMOZ-lon/15+tz-12-(0))
  Lever$=RSet(Str(Int(Lever)),2,"0")+":"+RSet(Str(Round(Mod(Lever,1)*60,#PB_Round_Down)),2,"0")
  Coucher$=RSet(Str(Int(Coucher+12)),2,"0")+":"+RSet(Str(Round(Mod(Coucher,1)*60,#PB_Round_Down)),2,"0")
  
  *Soleil\Lever$=Lever$
  *Soleil\Coucher$=Coucher$
  
  ;ProcedureReturn "Lever du soleil = "+Lever$+" - Coucher = "+Coucher$
EndProcedure
Procedure.s Lever_Soleil(lat.f,lon.f,JA)
  GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
  If DateQ() >=  TrouverDernierDimanche(AnneeQ(DateQ()), 3) Or DateQ() <= TrouverDernierDimanche(AnneeQ(DateQ()), 10)
  Else
    Retour=-TimeZoneInfo\bias/60
    ;Debug Retour
    ;Debug CalculerSoleil(lat.f,lon.f,JA,1+Retour)
  EndIf  
  ProcedureReturn *Soleil\Lever$
EndProcedure
Procedure.s Coucher_Soleil(lat.f,lon.f,JA)
  GetTimeZoneInformation_(TimeZoneInfo.TIME_ZONE_INFORMATION)
  If DateQ() >=  TrouverDernierDimanche(AnneeQ(DateQ()), 3) Or DateQ() <= TrouverDernierDimanche(AnneeQ(DateQ()), 10)
    CalculerSoleil(lat.f,lon.f,JA,1)
  Else
    Retour=(-TimeZoneInfo\bias/60)
    CalculerSoleil(lat.f,lon.f,JA,1+Retour)
  EndIf  
  ProcedureReturn *Soleil\Coucher$
EndProcedure
  Procedure.i DecalageHoraire(type)
    ; Retourne l'heure de la zone d'information de polarisation en quelques minutes
    ; Decalage=1 retourne (localtime-UTCTime) excluant l'heure d'été
    ; Decalage=2 retourne (localtime-UTCTime), y compris l'heure d'été
    ; Decalage=3 retourne la polarisation d'été locale qui est
    ;   en vigueur à ce moment et sera de 0 en hiver
    ; Decalage=4 retourne la polarisation d'été locale fixe (généralement 60)
    ; N.B. DecalageHoraireQ(2)=DecalageHoraireQ(1)+DecalageHoraireQ(3)
    ; L'heure UTC utilisée est appelée GMT
    Protected zoneid, tz.TIME_ZONE_INFORMATION, daylight
    zoneid = GetTimeZoneInformation_(tz)
    With tz
      If zoneid=#TIME_ZONE_ID_DAYLIGHT
        daylight = tz\DaylightBias
      Else
        daylight = 0
      EndIf
      Select type
        Case 1
          ProcedureReturn -tz\Bias
        Case 2
          ProcedureReturn -tz\Bias-daylight
        Case 3
          ProcedureReturn -daylight
        Case 4
          ProcedureReturn -tz\DaylightBias
      EndSelect
      ProcedureReturn 0
    EndWith
  EndProcedure
  Procedure.s ZoneFuseau()
    ; Retourne le nom du fuseau horaire
    Protected TimeZoneInfo.TIME_ZONE_INFORMATION
    Protected i=0, NomStandard$=""
    GetTimeZoneInformation_(TimeZoneInfo)
    While TimeZoneInfo\StandardName[i]<>0 And i<=32
      NomStandard$ + Chr(TimeZoneInfo\StandardName[i])
      i + 1
    Wend
    ProcedureReturn NomStandard$
  EndProcedure
  Procedure.b JoursDansMois(Annee=-1,Mois=-1)
    ;Retourne le nombre de jours dans le mois donné (28..31)
    ;Si l'année est absente, l'année en cours est utilisée
    ;Si l'année est présente mais le mois est absent,février est utilisé
    ;Si l'année et le mois sont tous deux absents, le mois courant de l'année en cours est utilisé
    
    Protected Jours
    
    If Annee = -1
      Annee=Year(Date())
      If Mois = -1
        Mois=Month(Date())
      EndIf
    Else
      If Mois <= 0 : Mois = 2 : EndIf
    EndIf
    
    If Mois=2
      If SiBissextile(Annee)
        Jours=29
      Else
        Jours=28
      EndIf
    Else
      jours=31 - $A55 >> Mois & 1
    EndIf
    NbjoursMois=Jours
    ProcedureReturn NbjoursMois
  EndProcedure
  ;Premier dimanche du mois
  Procedure TrouverPremierDimanche(Annee,Mois)
    Protected Jour=1
    Protected DatePremierDimanche=Date(Annee,Mois,Jour,0,0,0)
    
    ;Cherche le premier dimanche
    While DayOfWeek(DatePremierDimanche)<>0
      
      Jour+1
      DatePremierDimanche=Date(Annee,Mois,Jour,0,0,0)
    Wend
    
    ProcedureReturn DatePremierDimanche
    
  EndProcedure
  ;Second dimanche du mois
  Procedure TrouverDeuxiemeDimanche(Annee,Mois)
    Protected Jour=8
    Protected DateDeuxiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    
    ;Cherche le deuxième dimanche
    While DayOfWeek(DateDeuxiemeDimanche)<>0
      
      Jour+1
      DateDeuxiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    Wend
    
    ProcedureReturn DateDeuxiemeDimanche
    
  EndProcedure
  ;Troisième jour du mois
  Procedure TrouverTroisiemeDimanche(Annee,Mois)
    Protected Jour=15
    Protected DateTroisiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    
    ;Cherche le Troisième dimanche
    While DayOfWeek(DateTroisiemeDimanche)<>0
      
      Jour+1
      DateTroisiemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    Wend
    
    ProcedureReturn DateTroisiemeDimanche
    
  EndProcedure
  ;Pénultième dimanche du mois
  Procedure TrouverQuatriemeDimanche(Annee,Mois)
    Protected Jour=22
    Protected DateQuatriemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    
    ;Cherche le Quatrième dimanche
    While DayOfWeek(DateQuatriemeDimanche)<>0
      
      Jour+1
      DateQuatriemeDimanche=Date(Annee,Mois,Jour,0,0,0)
    Wend
    
    ProcedureReturn DateQuatriemeDimanche
    
  EndProcedure
  ;Dernier dimanche du mois
  Procedure TrouverDernierDimanche(Annee,Mois)
    Protected Jour=JoursDansMois() - 6
    Protected DateDernierDimanche=Date(Annee,Mois,Jour,0,0,0)
    
    ;Cherche le dernier dimanche
    While DayOfWeek(DateDernierDimanche)<>0
      
      Jour+1
      DateDernierDimanche=Date(Annee,Mois,Jour,0,0,0)
    Wend
    ProcedureReturn DateDernierDimanche
    
  EndProcedure
  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
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
Procedure$ Saison(nJour,nMois);Permet de déterminer la saison correspondant au jour et au mois donnés
  Protected$ sResultat
  
  ;i=Annee-2016
  i = AnneeQ(DateQ()) - 2016
  Annee = AnneeQ(DateQ())
  
  If JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0)) >= *J_Saison\Printemps[i] And JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0)) < *J_Saison\Ete[i]
    sResultat="printemps"
  ElseIf JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))>=*J_Saison\Ete[i] And JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))<*J_Saison\Automne[i]
    sResultat="été"
  ElseIf JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))>=*J_Saison\Automne[i] And JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))<*J_Saison\Hiver[i]
    sResultat="automne"
  ElseIf JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))>=*J_Saison\Hiver[i] Or JourDAnneeQ(DateQ2(Annee,nMois,nJour,0,0,0))<*J_Saison\Printemps[i]
    sResultat="hiver"
  EndIf
  ;Debug sResultat
  ProcedureReturn sResultat
EndProcedure
  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
  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
  Procedure.s Calculer_Age(A_avant, M_avant, J_avant, A_apres, M_apres, J_apres)
    Protected.q DateAvant2D, DateApres2D 
    DateAvant2D = DateQ2(A_avant, M_avant, J_avant, 0, 0, 0)
    DateApres2D = DateQ2(A_apres, M_apres, J_apres, 0, 0, 0)
    ProcedureReturn DiffTempsQ(DateApres2D - DateAvant2D)
  EndProcedure
  Procedure Anniversaire_Dans(AnneeNaissance, MoisNaissance, JourNaissance)
    Protected.q DateNaissance, DateAnniversaire
    Protected Resultat
    DateNaissance = DateQ2(AnneeNaissance, MoisNaissance, JourNaissance)
    DateAnniversaire = DateQ2(AnneeQ(DateQ()), MoisNaissance, JourNaissance)
    Resultat = DiffDatesQ(DateQ(), DateAnniversaire, #Date_JourQ)
    If Resultat <= 0
      DateAnniversaire = AjouterDateQ(DateAnniversaire, #Date_AnneeQ, 1)
    EndIf
    ProcedureReturn DiffDatesQ(DateQ(), DateAnniversaire, #Date_JourQ)
  EndProcedure
  Procedure Calculer_Date_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
    Protected.q DateNaissance, DateAnniversaire
    Protected Resultat
    DateNaissance = DateQ2(AnneeNaissance, MoisNaissance, JourNaissance)
    DateAnniversaire = DateQ2(AnneeQ(DateQ()), MoisNaissance, JourNaissance)
    Resultat = DiffDatesQ(DateQ(), DateAnniversaire, #Date_JourQ)
    If Resultat < 0
      DateAnniversaire = AjouterDateQ(DateAnniversaire, #Date_AnneeQ, 1)
    EndIf
    ProcedureReturn DateAnniversaire
  EndProcedure
  Procedure.s Decomposer_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
    Protected.q DateAnniversaire = Calculer_Date_Anniversaire(AnneeNaissance, MoisNaissance, JourNaissance)
    ProcedureReturn DiffTempsQ(Aujourdhui_0Q()-DateAnniversaire)
  EndProcedure
EndModule
Dernière modification par Micoute le dim. 15/oct./2023 13:07, modifié 1 fois.
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 : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module DateQ perfectionné

Message par Micoute »

EXEMPLE

Code : Tout sélectionner

CompilerIf #PB_Compiler_IsMainFile  
  EnableExplicit
  
  ;-Début du programme
  ;{ Initialisation de la partie graphique
  Global Police =FontID(LoadFont(#PB_Any, "DejaVu Sans Mono", 14))
  
  ExamineDesktops() : Global Largeur = DesktopWidth(0), Hauteur = DesktopHeight(0), Profondeur = DesktopDepth(0)
  InitSprite()
  InitKeyboard()
  InitMouse()
  
  OpenScreen(Largeur, Hauteur, 32, "DateQ")
  
  ClearScreen($5FBA01)
  StartDrawing(ScreenOutput())
  
  DrawingFont(Police)
  DrawingMode(#PB_2DDrawing_Default)
  ;}
  UseModule DateQ
  
  ;{ Première rangée
  Global date.q, date2.q, format.s, *MaDiff.sDiffTemps
  Global x,y,Texte.s, Titre.s = "DateQ", date.q, date2.q, format.s
  Global d1, d2, d3, d4, dateActuelle.q, date1, Annee, Mois, Txt.s, i
  BackColor(Point(10,10))
  FrontColor($FFFFFF)
  x = 10
  y = 10
  date.q = DateQ2(2000, 10, 22, 21, 45, 20)
  date2.q = DateQ()
  format.s = "%dd/%mm/%yyyy - %hh:%ii:%ss"
  ;
  DrawText(x, y, "Jour de ma naissance: " + NomJourSemaineQ(date)  + " " +FormatDateQ(format, date)):y + TextHeight(" ")
  DrawText(x, y, "Mon 20e anniversaire: " + NomJourSemaineQ(AjouterDateQ(date,#Date_AnneeQ,20))  + " " +FormatDateQ(format, AjouterDateQ(date,#Date_AnneeQ,20))):y + TextHeight(" ")
  DrawText(x, y, "Mon 23e anniversaire: " + NomJourSemaineQ(AjouterDateQ(date,#Date_AnneeQ,23))  + " " +FormatDateQ(format, AjouterDateQ(date,#Date_AnneeQ,23))):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  ; 
  date = DateQ2(2024, 2, 29, 12, 4, 34)
  DrawText(x, y, "Date julienne du 29 février 2024 à 12 heures 4 minutes et 34 secondes: "+Str(date)):y + TextHeight(" ")
  DrawText(x, y, "Date julienne de la même date 6 mois plus tard:                        "+Str(AjouterDateQ(date, #Date_MoisQ, 6))):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "FormatDate de la même date:      " + FormatDateQ(format, date)):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 36 minutes plus tard: " + FormatDateQ(format, AjouterDateQ(date, #Date_MinuteQ, 36))):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 6 mois après:         " + FormatDateQ(format, AjouterDateQ(date, #Date_MoisQ, 6))):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 47 mois après:        " + FormatDateQ(format, AjouterDateQ(date, #Date_MoisQ, 47)) + " tous les mois ont un 29 sauf février"):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 48 mois après:        " + FormatDateQ(format, AjouterDateQ(date, #Date_MoisQ, 48))):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 2 ans après:          " + FormatDateQ(format, AjouterDateQ(date, #Date_AnneeQ, 2)) + " pas de 29 février"):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 3 ans après:          " + FormatDateQ(format, AjouterDateQ(date, #Date_AnneeQ, 3)) + " pas de 29 février"):y + TextHeight(" ")
  DrawText(x, y, "FormatDate 4 ans après:          " + FormatDateQ(format, AjouterDateQ(date, #Date_AnneeQ, 4))):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  d1 = DateQ2(2023, 1, 1)
  d2 = DateQ2(2023, 1, 2)
  d3 = DateQ2(2023, 1, 2,12)
  d4 = DateQ2(2023, 1, 2,12,30)
  DrawText(x, y, "01/01/2023          - 02/01/2023 12      =  "+Str(d4-d3)+" minutes"):y + TextHeight(" ")
  DrawText(x, y, "02/01/2023 12       - 02/01/2023         = " +Str(d3-d2)+" secondes"):y + TextHeight(" ")
  DrawText(x, y, "02/01/2023          - 01/01/2023         = " +Str(d2-d1)+" secondes"):y + TextHeight(" ")
  
  DrawText(x, y, ""):y + TextHeight(" ")
  
  DrawText(x, y, "Date actuelle: heure et jour: "+FormatDateQ(format, DateQ())):y + TextHeight(" ")
  dateActuelle.q = DateQ2(AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ()), 0, 0, 0)
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "Date julienne de la date actuelle: " + dateActuelle):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  date.q = DateQ2(2000, 10, 22, 21, 45, 20)
  DrawText(x, y, "date.q = DateQ2(2000, 10, 22, 21, 45) = Date julienne de ma naissance: " + date):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  date.q = AujourdhuiQ()
  DrawText(x, y, "Jour de Semaine : " + JourDeSemaineQ(date) + " - NomJourSemaine : " + NomJourSemaineQ(date)):y + TextHeight(" ")
  DrawText(x, y, "Jour du mois : " + JourQ(date)):y + TextHeight(" ")
  DrawText(x, y, "Mois : " + MoisQ(date) + " = NomMois : " + NomMoisQ(date)):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  Date.q = AujourdhuiQ()
  Date2.q = Aujourdhui_0Q()
  DrawText(x, y, "La date et l'heure d'ujourd'hui est : " + FormatDateQ("%dd/%mm/%yyyy %hh:%ii:%ss", AujourdhuiQ())):y + TextHeight(" ")
  DrawText(x, y, "La date d'aujourd'hui à minuit est  : " + FormatDateQ("%dd/%mm/%yyyy %hh:%ii:%ss", Aujourdhui_0Q())):y + TextHeight(" ")
  DrawText(x, y, "La date julienne courante aujourdhui est   : " + AujourdhuiQ()):y + TextHeight(" ")
  DrawText(x, y, "La date julienne à minuit aujourdhui est   : " + Aujourdhui_0Q()):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  ; Exemple DiffDates
  date1 = DateQ2(2021,01,01): date2 = DateQ2(2024,12,31) 
  DrawText(x, y, "date1 = DateQ2(2021,01,01): date2 = DateQ2(2024,12,31)"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Annee)      = " + Str(DiffDatesQ(date1, date2, #Date_AnneeQ)) + " (années)"):y + TextHeight(" "); 2 ans
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Semaine)    = " + Str(DiffDatesQ(date1, date2, #Date_SemaineQ)) + " (semaines)"):y + TextHeight(" ") ; 1 semaine
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Mois, 3)    = " + Str(DiffDatesQ(date1, date2, #Date_MoisQ, 3)) + " (trimestres)"):y + TextHeight(" ") ; 3 mois/Trimestre
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Mois)       = " + Str(DiffDatesQ(date1, date2, #Date_MoisQ)) + " (mois)"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Semaine, 2) = " + Str(DiffDatesQ(date1, date2, #Date_SemaineQ, 2)) + " (quinzaines)"):y + TextHeight(" ") ; 2 semaines/Quinzaines
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Jour)       = " + Str(DiffDatesQ(date1, date2, #Date_JourQ)) + " (jours)"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Heure)      = " + Str(DiffDatesQ(date1, date2, #Date_HeureQ)) + " (heures)"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Minute)     = " + Str(DiffDatesQ(date1, date2, #Date_MinuteQ)) + " (minutes)"):y + TextHeight(" ")
  y + TextHeight(" ")
  date1 = DateQ2(2000, 10, 22,21,45,20) : date2 = DateQ2(AnneeQ(DateQ()),MoisQ(DateQ()),JourQ(DateQ()))
  DrawText(x, y, "date1 = DateQ2(2000, 10, 22,21,45)   : date2 = DateQ2(AnneeQ(DateQ()),MoisQ(DateQ()),JourQ(DateQ()))"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Jour)       = " + Str(DiffDatesQ(Date1, Date2, #Date_JourQ)) + " (jours)"):y + TextHeight(" ")
  DrawText(x, y, "DiffDatesQ(date1, date2, #Date_Annee       = " + Str(DiffDatesQ(Date1, Date2, #Date_AnneeQ)) + " ans"):y + TextHeight(" ")
  ;}
  ;{ 2ème rangée
  ; Fêtes mobiles
  y = 10 : x + 1170
  DrawText(x, y, "Mardi gras  : " + Left(NomJourSemaineQ(Mardi_Gras(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, Mardi_Gras(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Rameaux     : " + Left(NomJourSemaineQ(Rameaux(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, Rameaux(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Pâques      : " + Left(NomJourSemaineQ(DatePaques(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, DatePaques(DateQ())), 10)):y + TextHeight(" ")
  DrawText(x, y, "Lundi pâques: " + Left(NomJourSemaineQ(PaquesLundi(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, PaquesLundi(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Ascension   : " + Left(NomJourSemaineQ(Ascension(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, Ascension(AnneeQ(DateQ()))), 10) ):y + TextHeight(" ")
  DrawText(x, y, "Pentecôte   : " + Left(NomJourSemaineQ(Pentecote(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, Pentecote(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Premier dimanche de l'Avent   : " + Left(FormatDateQ(format, PremierDimanche_Avent(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Deuxième dimanche de l'Avent  : " + Left(FormatDateQ(format, DeuxiemeDimanche_Avent(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Troisième dimanche de l'Avent : " + Left(FormatDateQ(format, TroisiemeDimanche_Avent(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Dernier dimanche de l'Avent   : " + Left(FormatDateQ(format, Quatrieme_Dimanche_Avent(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Noël                      : " + Left(NomJourSemaineQ(Noel(AnneeQ(DateQ()))), 3) + " " + Left(FormatDateQ(format, Noel(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "Printemps "+ FormatDateQ("%dd/%mm/%yyyy", *Saison\Printemps[AnneeQ(DateQ())-2016])):y + TextHeight(" ")
  DrawText(x, y, "Eté       "+ FormatDateQ("%dd/%mm/%yyyy", *Saison\ETE[AnneeQ(DateQ())-2016])):y + TextHeight(" ")
  DrawText(x, y, "Automne   "+ FormatDateQ("%dd/%mm/%yyyy", *Saison\Automne[AnneeQ(DateQ())-2016])):y + TextHeight(" ")
  DrawText(x, y, "Hiver     "+ FormatDateQ("%dd/%mm/%yyyy", *Saison\Hiver[AnneeQ(DateQ())-2016])):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "Fête des mamies " + Left(FormatDateQ(format, Fete_des_grand_meres(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Fête des mères  " + Left(FormatDateQ(format, Fete_des_meres(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Fête des pères  " + Left(FormatDateQ(format, Fete_des_peres(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, "Fête des papis  " + Left(FormatDateQ(format, Fete_des_grand_peres(AnneeQ(DateQ()))), 10)):y + TextHeight(" ")
  DrawText(x, y, ""):y + TextHeight(" ")
  Annee = AnneeQ(DateQ())
  DrawText(x, y, "Premiers jours ouvrés de l'année " + Annee):y + TextHeight(" ")
  i = 1
  While i <= 12
    DrawText(x, y, Premier_Ouvre_Mois(Annee,i)):y + TextHeight(" ")
    i + 1
  Wend  
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "Les vendredis 13 de l'année " + Annee):y + TextHeight(" ")
  For Mois=1 To 12
    Global vendredi13=ChercherVendredi13(Annee,Mois)
    
    If JourQ(Vendredi13)=13
      DrawText(x, y, "vendredi " + FormatDateQ("%jj",Vendredi13)+" "+Trim(TabNomMois$(Mois - 1))+" "+Annee):y + TextHeight(" ")
    EndIf
    
  Next Mois
  DrawText(x, y, ""):y + TextHeight(" ")
  DrawText(x, y, "Zone fuseau horaire : " + ZoneFuseau()):y + TextHeight(" ")
  Select DecalageHoraire(3)
    Case 0
      Txt.s = " hiver"
    Case 60
      Txt.s = " été"
  EndSelect
  DrawText(x, y, "Décalage horaire actuel : " + Txt):y + TextHeight(" ")
  
  y + TextHeight(" ")
  
  DrawText(x, y, "(__ AnalyserDateQ(Masque.s, Date.s) __)")
  y + TextHeight(" ")
  Global.q MaDate1 = DateQ2(2000, 10, 22, 21, 45)
  Global.s MaDate2 = FormatDateQ(format, MaDate1)
  DrawText(x, y, "AnalyserDateQ(" + 
                 #DQUOTE$ + format + #DQUOTE$ + ", " + 
                 #DQUOTE$ + MaDate2 + #DQUOTE$ + ") = " + 
                 Str(AnalyserDateQ(format, MaDate2)))
  y + TextHeight(" ")
  y + TextHeight(" ")
  ;}
  ;{ 3ème rangée
  X + 600 : Y = 10
  DrawText(x, y, "Aujourd'hui, j'ai : " + Calculer_Age(2000,10,22, AnneeQ(DateQ()), MoisQ(DateQ()), JourQ(DateQ())))
  y + TextHeight(" ")
  If Anniversaire_Dans(2000,10,22) >= 2
    Texte = "Mon anniversaire est dans "
  Else
    Texte = "Mon anniversaire est "
  EndIf
  DrawText(x, y, Texte+Anniversaire_Dans(2000,10,22)+ " jour(s)")
  y + TextHeight(" ")
  If Anniversaire_Dans(2000,10,22) >= 2
    Texte = "soit dans"
  Else
    Texte = "soit "
  EndIf
  DrawText(x, y, Texte+Decomposer_Anniversaire(2000,10,22))
  y + TextHeight(" ")
  DrawText(x, y, "Mon anniversaire sera le "+FormatDateQ("%dd/%mm/%yyyy", Calculer_Date_Anniversaire(2000,10,22)))
  y + TextHeight(" ")
  y + TextHeight(" ")
  
  Annee = AnneeQ(DateQ())
  DrawText(x, y, "==============================")
  y + TextHeight(" ")
  DrawText(x, y, "Heure d'été   : " + FormatDateQ("%dd " + Trim(TabNomMois$(MoisQ(Heure_d_ete(annee)) - 1)), Heure_d_ete(Annee))+" "+Annee)
  y + TextHeight(" ")
  DrawText(x, y, "Heure d'hiver : " + FormatDateQ("%dd " + Trim(TabNomMois$(MoisQ(Heure_d_hiver(annee)) - 1)), Heure_d_hiver(Annee))+" "+Annee)
  y + TextHeight(" ")
  DrawText(x, y, "==============================")
  y + TextHeight(" ")
  y + TextHeight(" ")
  DrawText(x, y, "Le mois finira dans : " + NbreJoursRestantsMois() + " Jours")
  y + TextHeight(" ")
  DrawText(x, y, "L'année finira dans : " + NbreJoursRestantsAnnee() + " Jours")
  y + TextHeight(" ")
  y + TextHeight(" ")
  FindMapElement(Fetes_Journalieres(), Str(JourDAnneeQ(DateQ()) - 1))
  DrawText(x, y, "Aujourd'hui c'est la fête à : " + Fetes_Journalieres()\Fete)
  y + TextHeight(" ")
  y + TextHeight(" ")
  ;}
  DrawText(1150, 1044, UCase("Pressez Echap pour quitter"))
  
  ;{ Fin de la partie graphique
  StopDrawing()
  FlipBuffers()
  
  Repeat
    
    ExamineMouse()
    ExamineKeyboard()
  Until KeyboardPushed(#PB_Key_Escape)  
  ;}
CompilerEndIf
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 !
boddhi
Messages : 604
Inscription : lun. 26/avr./2010 16:14
Localisation : S 48° 52' 31'' / O 123° 23' 33''

Re: Module DateQ perfectionné

Message par boddhi »

Salut Micoute,

Codes intéressants, merci. :wink:

D'avance pardon, je vais encore jouer les casse-burnes :mrgreen: et ce qui suit n'est en aucun cas une injonction.
Une partie des données s'affichent en dehors de l'écran... à cause du DPI
Il faudrait utiliser les fonctions DesktopScaledX() et DesktopScaledY() pour gérer l'affichage graphique correctes des données chez ceux, de plus en plus nombreux, qui utilisent le flag DPI aware. :wink:
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Module DateQ perfectionné

Message par Micoute »

Bonjour boddhi,

tu as sûrement raison, maintenant que tu as téléchargé le code, il t'appartiens de le modifier à tes souhaits.
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