Fonctions de dates

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

Fonctions de dates

Message par Micoute »

Bonjour à tous, je vous offre ma bibliothèque de fonctions de dates et j'espère que ça vous plaira, vous avez le droit de modifier le logiciel.

Code : Tout sélectionner

;Fonctions_Date.pbi

EnableExplicit

#SecsParJour = 86400
Enumeration
  #Date_Annee
  #Date_Mois
  #Date_Semaine
  #Date_Jour
  #Date_Heure
  #Date_Minute
  #Date_Seconde
EndEnumeration

Structure DiffTemps 
  TotalJours.i
  Annees.i 
  Mois.i 
  JoursRestants.i 
  Heures.i 
  Minutes.i 
  Secondes.i 
EndStructure

Structure StrucSaisons
  Printemps.i[20]
  Ete.i[20]
  Automne.i[20]
  Hiver.i[20]
EndStructure

Structure StrucSoleil
  Lever$
  Coucher$
EndStructure  

#Quantite = 365

Structure MaDate
  Jour.i
  Mois.i
  NSem.i ;Numéro de semaine
EndStructure 


Declare.b SiBissextile(Annee=-1)
Declare$ ChaineDate(Masque$, date.i) 
Declare.b JoursDansMois(Annee=-1, mois=-1)
Declare$ DDA(Annee=-1) ;
Declare$ FDA(Annee=-1) ;
Declare$ DDM(Annee=-1,Mois=-1) ;
Declare$ FDM(Annee=-1, Mois=-1);
Declare.w JDA(Annee=-1)        ;
Declare.w JourRestantAnnee()   ;
Declare.b DonneSemaine(PAnnee.i,PMois.b,PJour.b) ;
Declare.b NumSemaine()                           ;
Declare.i NumeroSemaine(Date.i)                  ;
Declare.b NbSemRestant()                         ;
Declare$ JDS()                                   ;
Declare.b Jour(_Jour_=-1)                        ;
Declare$ NomMois()                               ;
Declare.i Mois(_Mois_=-1)
Declare.w JourRestantMois(Mois) ;
Declare.i Annee(_Annee_=-1)
Declare.i EstDateValide(Jour,Mois,Annee) ;
Declare$ CToD(Chaine$)                   ;
Declare$ DToC(Chaine$)                   ;
Declare.i DToN(Chaine$)                  ;
Declare$ NToD(Nombre.i)                  ;
Declare.i IncrementerAnnees(Annee =-1, Nombre_d_annees = 1)
Declare.i IncrementerMois(Annee = -1, Nombre_de_mois = 1)
Declare.i IncrementerJours(Annee = -1, Nombre_de_jours = 1)
Declare.i IncrementerHeures(Annee = -1, Nombre_d_heures = 1)
Declare.i IncrementerMinutes(Annee = -1, Nombre_de_Minutes = 1)
Declare.i IncrementerSecondes(Annee = -1, Nombre_de_Secondes = 1)
Declare.i IncrementerDate(Annee = -1, Nombre_d_annees = 0, Nombre_de_mois = 0, Nombre_de_jours = 0, Nombre_d_heures = 0, Nombre_de_Minutes = 0, Nombre_de_Secondes = 0)
Declare.i DateDiff(dateAvant, dateApres, *diff.DiffTemps) 
Declare.i AnalyserDate(Date$)
Declare.s ComparerDates(Date1$, Date2$)
Declare.i CalculerAge(jour_naissance.b,mois_naissance.b,annee_naissance.q)
Declare.i TrouverPremierDimanche(Annee, Mois)
Declare.i TrouverDeuxiemeDimanche(Annee, Mois)
Declare.i TrouverTroisiemeDimanche(Annee, Mois)
Declare.i TrouverQuatriemeDimanche(Annee, Mois)
Declare.i TrouverDernierDimanche(Annee, Mois)
Declare.s TrouverPremierJourSemaine(Annee, Mois, Joursem)
Declare.s TrouverDeuxiemeJourSemaine(Annee, Mois, Joursem)
Declare.s TrouverTroisiemeJourSemaine(Annee, Mois, Joursem)
Declare.s TrouverQuatriemeJourSemaine(Annee, Mois, Joursem)
Declare.s TrouverCinquiemeJourSemaine(Annee, Mois, Joursem)
Declare ChercherVendredi13(Annee, Mois)
Declare$ SigneAstro(Jour,Mois) ;
Declare$ Saison(Jour, Mois)    ;
Declare$ Article_Saison(jour, mois)
Declare$ Article_Astro(jour, mois)
Declare.s NomJourSemaine(Annee=-1,Mois=-1,Jour=-1)
Declare.s ZoneFuseau()
Declare.i DecalageHoraire(type)
Declare.s CalculerSoleil (lat.f, lon.f, JA.i, tz.d)  
Declare.s Lever_Soleil(lat.f, lon.f, JA.i, tz.d)
Declare.s Coucher_Soleil(lat.f, lon.f, JA.i, tz.d)
Declare.i MonJDS (date.i)
Declare.i NumSem(date.i)
Declare CalculerNumSem()

Global Annee, mois, NbjoursMois
Global NumSem.b, NbJMR.b, date, NumJS, i
Global JourCourant$, MoisCourant$, DateCourante$
Global Semaine.b
Global Masque$ = "%dddd %dd %mmm %yyyy" 
Global NomJours$ = "dimanche lundi mardi mercredi jeudi vendredi samedi"
Global NomJoursAbr$ = "dim lun mar mer jeu ven sam"
Global NomMois$ = "janvier février mars avril mai juin juillet août septembre octobre novembre décembre"
Global NomMoisAbr$ = "jan. fév. mars avr. mai juin juil. août sept. oct. nov. déc."
Global *Saison.StrucSaisons = AllocateStructure(StrucSaisons), *Soleil.StrucSoleil = AllocateStructure(StrucSoleil), w=1, X, Y, Z
Global Dim TabNomMois$(1,12), Dim TabNomJours$(1,7)
Global.s Date_Printemps, Date_Ete, Date_Automne, Date_Hiver, Lever$, Coucher$
Global.MaDate Dim MaDonnee(365)

CalculerNumSem()

Restore Printemps
For Z = 0 To 19
  Read.s Date_Printemps
  With *Saison
    \Printemps[Z] = ParseDate("%dd/%mm/%yyyy", Date_Printemps)
  EndWith
Next Z
Restore Ete
For Z = 0 To 19
  Read.s Date_Ete
  With *Saison
    \Ete[Z] = ParseDate("%dd/%mm/%yyyy", Date_Ete)
  EndWith
Next Z
Restore Automne
For Z = 0 To 19
  Read.s Date_Automne
  With *Saison
    \Automne[Z] = ParseDate("%dd/%mm/%yyyy", Date_Automne)
  EndWith
Next Z
Restore Hiver
For Z = 0 To 19
  Read.s Date_Hiver
  With *Saison
    \Hiver[Z] = ParseDate("%dd/%mm/%yyyy", Date_Hiver)
  EndWith
Next Z  

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"
  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"
  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"
  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"
EndDataSection

Macro Bissextile(Annee)
  Bool(((Not Year(Annee) % 4) And Year(Annee) % 100) Or (Not Year(Annee) % 400))
EndMacro

For i = 1 To 12
  TabNomMois$(0, i) = StringField(NomMois$, i, " ")
  TabNomMois$(1, i) = Str(i)
Next i

For i = 1 To 7
  TabNomJours$(0, i) = StringField(NomJours$, i, " ")
  TabNomJours$(1, i) = Str(i)
Next i

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ée sur 8 jours bissextiles tous les 33 ans (365,242424 jours)
  ; dictionary.die.net/leap%20year
  ; en.wikipedia.org/wiki/Leap_year
  If Annee<=0
    Annee = Year(Date())
  EndIf ; Cette année
  If (Mod(Annee,4)=0 And Mod(Annee,100)<>0) Or (Mod(Annee,400)=0)
    ProcedureReturn #True
  EndIf
  ProcedureReturn #False
EndProcedure

;FormatDate personnalisé
Procedure$ ChaineDate(Masque$, date.i) 
  
  Masque$ = ReplaceString (Masque$, "%dddd" , StringField ( NomJours$ , DayOfWeek (date) + 1, " " )) 
  Masque$ = ReplaceString (Masque$, "%ddd" , StringField ( NomJoursAbr$ , DayOfWeek (date) + 1, " " )) 
  Masque$ = ReplaceString (Masque$, "%mmmm" , StringField ( NomMois$ , Month (date), " " )) 
  Masque$ = ReplaceString (Masque$, "%mmm" , StringField ( NomMoisAbr$ , Month (date), " " )) 
  
  ProcedureReturn FormatDate (Masque$, date) 
  
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 Bissextile(Annee)
      Jours = 29
    Else
      Jours = 28
    EndIf  
  Else
    jours = 31-$A55>>mois&1
  EndIf
  
  NbjoursMois = Jours
  
  ProcedureReturn NbjoursMois
EndProcedure

Procedure$ DDA(Annee=-1) ; Début de l'année
  ; Si l'année est absente, l'année en cours est utilisée
  If Annee < 0
    DateCourante$ = ChaineDate(Masque$,Date(Year(Date()),1,1,0,0,0))
  Else
    DateCourante$ = ChaineDate(Masque$,Date(Annee,1,1,0,0,0))
  EndIf
  ProcedureReturn DateCourante$
EndProcedure

Procedure$ FDA(Annee=-1) ; Fin de l'année
  ; Si l'année est absente, l'année en cours est utilisée
  If Annee < 0
    DateCourante$ = ChaineDate(Masque$,Date(Year(Date()),12,31,0,0,0))
  Else
    DateCourante$ = ChaineDate(Masque$,Date(Annee,12,31,0,0,0))
  EndIf
  ProcedureReturn DateCourante$
EndProcedure

Procedure$ DDM(Annee=-1,Mois=-1) ; Début du mois
  ; 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é
  If Annee < 0 Or mois < 0
    DateCourante$ = ChaineDate(Masque$,Date(Year(Date()),Month(Date()),1,0,0,0))
  Else
    DateCourante$ = ChaineDate(Masque$,Date(Annee,Mois,1,0,0,0))
  EndIf
  ProcedureReturn DateCourante$
EndProcedure

Procedure$ FDM(Annee=-1, Mois=-1) ; Fin du mois
  ; 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é
  If Annee < 0 Or mois < 0
    ProcedureReturn ChaineDate(Masque$,Date(Year(Date()),Month(Date()),JoursDansMois(),0,0,0))
  Else
    ProcedureReturn ChaineDate(Masque$,Date(Annee,Mois,JoursDansMois(),0,0,0))
  EndIf
EndProcedure

Procedure.w JDA(Annee=-1) ; Jour de l'année
  ; Si l'année est absente, l'année en cours est utilisée
  If Annee < 0
    ProcedureReturn DayOfYear(Date())
  Else
    ProcedureReturn DayOfYear(Annee)
  EndIf
EndProcedure

Procedure.w JourRestantAnnee() ; Jours restants pour finir l'année
  ; Si l'année est absente, l'année en cours est utilisée
  
  Protected reste = 365 + SiBissextile(Annee)
  
  ProcedureReturn reste-Int(DayOfYear(Date()))
EndProcedure

Procedure.b DonneSemaine(PAnnee.i,PMois.b,PJour.b) ; Numéro de semaine correspondant à la date
  PAnnee=Year(Date())
  PMois=Month(Date())
  PJour=Day(Date())
  
  Protected Semaine4J.b = DayOfWeek(Date(PAnnee,1,4,0,0,0)) 
  If Semaine4J = 0 : Semaine4J = 7 : EndIf 
  Protected MoSemaine1.b = 4-Semaine4J 
  Protected SemaineGD.b = DayOfWeek(Date(PAnnee,PMois,PJour,0,0,0)) 
  ; Lundi = 1 Dimanche = 7. 
  If SemaineGD = 0 : SemaineGD = 7 : EndIf 
  Protected MoGD.w = DayOfYear(Date(PAnnee,PMois,PJour,0,0,0))-SemaineGD 
  Semaine = Int((MoGD-MoSemaine1)/7)+1 
  If PMois = 12 
    Protected NumSem1Q.w = DayOfYear(Date(PAnnee,PMois,PJour,0,0,0)) 
    Protected Semaine4JNA.b = DayOfWeek(Date(PAnnee+1,1,4,0,0,0)) 
    ; Lundi = 1 Dimanche = 7. 
    If Semaine4JNA = 0 : Semaine4JNA = 7 : EndIf 
    Protected JourAnneDerniere.w = DayOfYear(Date(PAnnee,12,31,0,0,0)) 
    If JourAnneDerniere - NumSem1Q < Semaine4JNA -4 
      Semaine = 1 
    EndIf 
  EndIf 
  
  If PMois = 1 And PJour < 4 
    If Semaine4J.b < SemaineGD.b
      ;Semaine = DonneSemaine(PAnnee-1,12,31) 
    EndIf 
  EndIf 
  ProcedureReturn Semaine
EndProcedure

Procedure.b NumSemaine() ; Numéro de la semaine
  Protected date.b, NumSem.i
  ;NumSem=DonneSemaine(Year(date),Month(date),Day(date))
  NumSem=MaDonnee(DayOfYear(Date()))\NSem
  ProcedureReturn NumSem
EndProcedure

Procedure.i NumeroSemaine(Date) ; Retourne le numéro de semaine de l'année
  Protected Semaine.i = 0
  Protected Compteur=Date(Year(Date),1,1,0,0,1) ;/ jour du nouvel an
  
  ;/ Aller au premier lundi
  Repeat
    If DayOfWeek(Compteur)=1 : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Day,1)
  ForEver
  
  ;/ Ajouter 1 semaine / Teste si la date est atteinte
  Repeat
    If Compteur>Date : Break : EndIf
    Compteur=AddDate(Compteur,#PB_Date_Week,1)
    Semaine+1
  ForEver
  
  ProcedureReturn Semaine
EndProcedure

Procedure.b NbSemRestant() ; Nombre de semaines pour finir l'année
  If JourRestantAnnee() > 6
    ProcedureReturn (52 - NumSemaine())+1
  Else
    ProcedureReturn (52 - NumSemaine())
  EndIf
EndProcedure

Procedure$ JDS() ; Jour de la semaine
  NumJS = DayOfWeek(Date())+1
  JourCourant$ = StringField(NomJours$,NumJS," ")
  ProcedureReturn JourCourant$
EndProcedure

Procedure.b Jour(_Jour_=-1) ; Jour actuel
  If _Jour_ <=0
    _Jour_ = Day(Date())
  EndIf  
  ProcedureReturn _Jour_
EndProcedure

Procedure$ NomMois() ; Mois actuel
  MoisCourant$ = StringField(NomMois$,Month(Date())," ")
  ProcedureReturn MoisCourant$
EndProcedure

Procedure.i Mois(_Mois_=-1)
  If _Mois_<=0
    _Mois_ = Month(Date()) ;Ce mois-ci
  EndIf
  ProcedureReturn _Mois_
EndProcedure 

Procedure.w JourRestantMois(Mois) ; Nombre de jours pour finir le mois
  NbJMR = JoursDansMois(Annee,Mois) - Jour()
  ProcedureReturn NbJMR
EndProcedure

Procedure.i Annee(_Annee_=-1)
  If _Annee_<=0
    _Annee_ = Year(Date()) ; Cette année
  EndIf
  ProcedureReturn _Annee_
EndProcedure

Procedure.i EstDateValide(Jour,Mois,Annee) ; - Indique si la date proposée est valide
  Protected Validite = 1 , Jour1 = 1 , Mois1 = 1 , Annee1 = 1 ; 1 = Valide, 0 = non valide.
  If Jour < 1 Or Jour > 31
    Jour1 = 0 ; Jour doit être 1-31.
  ElseIf Mois < 1 Or Mois > 12
    Mois1 = 0 ; Mois doit être 1-12.
  ElseIf Mois = 2 And Jour > 28 
    If Jour	>	29
      Jour1=0 ; février n'a JAMAIS plus de 29 Jours.
    Else
      ; Vérifie si février de l'année "Annee" est une année bissextile.  Notez que l'année
      ; 3600 est un cas spécial unique (www.google.com/search?q=leap+year+faq).
      Jour1 = Bool(Mod(Annee, 4) = 0 And
                   (Mod(Annee, 100) <> 0 Or
                    Mod(Annee, 400) = 0) And
                   Annee <> 3600)
    EndIf
  ElseIf (Mois = 4 Or Mois = 6 Or Mois = 9 Or Mois = 11) And Jour = 31
    Jour1=0 ; Ces mois ont seulement 30 jours.
  ElseIf Annee < 1 Or Annee > 9999
    Annee1 = 0 ; limite l'année à une gamme de 9999 ans
  EndIf
  If Jour1 = 0
    Validite = 0
  ElseIf Mois1 = 0
    Validite = 0
  ElseIf Annee1 = 0
    Validite = 0
  EndIf  
  ProcedureReturn Validite
EndProcedure

Procedure$ CToD(Chaine$) ; - Transforme une chaine en Date
  Protected Jour$, Mois$, Annee$, Resultat$
  
  Jour$  = RSet(Left(Chaine$,   2), 2,   "00")
  Mois$  = RSet(Mid(Chaine$, 3, 2), 2,   "00")
  Annee$ = RSet(Right(Chaine$,  4), 4, "0000")
  
  If Len(Chaine$) = 6
    Annee$ = Right(Chaine$, 2)
  ElseIf Len(Chaine$) = 8
    Annee$ = Right(Chaine$, 4)
  EndIf
  
  If   Val(Jour$) > 31 Or Val(Mois$) > 12
    Resultat$ = "Le format est : CToD(JJ/MM/AA) ou CToD(JJ/MM/AAAA)"
  EndIf		
  
  If Not EstDateValide(Val(Jour$), Val(Mois$), Val(Annee$))
    Resultat$ = "Date non valide"
  Else
    Resultat$ = Jour$+"/"+Mois$+"/"+Annee$
  EndIf
  ProcedureReturn resultat$
EndProcedure

Procedure$ DToC(Chaine$) ; - Transforme une Date en chaîne
  Protected Jour$, Mois$, Annee$, Resultat$
  
  Jour$ = StringField(Chaine$, 1, "/") : Mois$ = StringField(Chaine$, 2, "/") : Annee$ = StringField(Chaine$, 3, "/")
  
  Jour$ = RSet(Jour$, 2, "00")
  Mois$ = RSet(Mois$, 2, "00")
  Annee$ = RSet(Annee$, 4, "0000")
  
  If Len(Chaine$) < 8 Or Len(Chaine$) > 10
    Resultat$ = "Le format est : DToC(JJMMAA) ou DToC(JJMMAAAA)"
  EndIf
  
  If Not EstDateValide(Val(Jour$), Val(Mois$), Val(Annee$))
    Resultat$ = "Date non valide"
  Else 
    Resultat$ = Jour$ + Mois$ + Annee$
  EndIf
  ProcedureReturn Resultat$
EndProcedure

Procedure.i DToN(Chaine$) ; Convertit une date "JJ/MM/AAAA" en nombre entier
  Protected Jour$,Mois$,Annee$,Resultat
  
  Jour$ = StringField(Chaine$,1,"/") : Mois$ = StringField(Chaine$,2,"/") : Annee$ = StringField(Chaine$,3,"/")
  
  Jour$ = RSet(Jour$,2,"00")
  Mois$ = RSet(Mois$,2,"00")
  Annee$ = RSet(Annee$,4,"0000")
  
  If Val(Mois$)
    Resultat = Val(Jour$)*1000000+Val(Mois$)*10000+Val(Annee$)
  EndIf
  
  Select Mois$
    Case "02" 
      If Val(Jour$) <= 28 + SiBissextile(Val(Annee$))
        ProcedureReturn Resultat
      EndIf
    Case "01","03","05","07","08","10","12"
      If Val(Jour$) <= 31
        ProcedureReturn Resultat
      EndIf
    Case "04","06","09","11"
      If Val(Jour$) <= 30
        ProcedureReturn Resultat
      EndIf
  EndSelect
  
  If Resultat <= 31129999
    ProcedureReturn 0
  EndIf
  
EndProcedure

Procedure$ NToD(Nombre.i) ; Convertit un nombre >= 01011001 <= 31129999 en date
  Protected sJour$, sMois$, sAnnee$, Resultat$, valide, Jour, Mois, Annee
  Resultat$ = RSet(Str(Nombre),8,"0")
  
  Jour = Val(Left(Resultat$,2))
  Mois = Val(Mid(Resultat$,3,2))
  Annee = Val(Right(Resultat$,4))
  valide = #True
  Select Annee
    Case 1 To 9999
      Select Mois
        Case 2
          If Jour < 1 Or Jour > 28 + SiBissextile(Annee)
            valide = #False
          EndIf
        Case 1,3,5,7,8,10,12
          If Jour < 1 Or Jour > 31
            valide = #False
          EndIf
        Case 4,6,9,11
          If Jour < 1 Or Jour > 30
            valide = #False
          EndIf
        Default
          valide = #False
      EndSelect
    Default
      valide = #False
  EndSelect
  
  If valide
    sJour$ = RSet(Str(Jour),2,"0")+"/"
    sMois$ = RSet(Str(Mois),2,"0")+"/"
    sAnnee$ = RSet(Str(Annee),4,"0")
    
    Resultat$ = sJour$+sMois$+sAnnee$
    ProcedureReturn Resultat$
  Else
    ProcedureReturn "Erreur"
  EndIf
EndProcedure

; Années
Procedure.i IncrementerAnnees(Annee =-1, Nombre_d_annees = 1)
  If Annee < 0
    Annee = Year(Date())
  EndIf  
  ProcedureReturn Date(Year(Annee) + Nombre_d_annees, Month(Annee), Day(Annee), Hour(Annee), Minute(Annee), Second(Annee))
EndProcedure

; Mois
Procedure.i IncrementerMois(Annee = -1, Nombre_de_mois = 1)
  Protected i
  If Annee < 0
    Annee = Year(Date())
  EndIf    
  For i = 1 To Nombre_de_mois
    Select Month(Annee)
      Case 12
        Annee = Date(Year(Annee) + 1, 1, Day(Annee), Hour(Annee), Minute(Annee), Second(Annee))
      Default
        Annee = Date(Year(Annee), Month(Annee) + 1, Day(Annee), Hour(Annee), Minute(Annee), Second(Annee))
    EndSelect
  Next
  ProcedureReturn Annee
EndProcedure

; Jours
Procedure.i IncrementerJours(Annee = -1, Nombre_de_jours = 1)
  Protected i
  For i = 1 To Nombre_de_jours
    Select Month(Annee)
      Case 4, 6, 9, 11
        If Day(Annee) = 30
          Annee = Date(Year(Annee), Month(Annee) + 1, 1, Hour(Annee), Minute(Annee), Second(Annee))
        Else
          Annee = Date(Year(Annee), Month(Annee), Day(Annee) + 1, Hour(Annee), Minute(Annee), Second(Annee))
        EndIf
      Case 1, 3, 5, 7, 8, 10
        If Day(Annee) = 31
          Annee = Date(Year(Annee), Month(Annee) + 1, 1, Hour(Annee), Minute(Annee), Second(Annee))
        Else
          Annee = Date(Year(Annee), Month(Annee), Day(Annee)+1, Hour(Annee), Minute(Annee), Second(Annee))
        EndIf
      Case 12
        If Day(Annee) = 31
          Annee = Date(Year(Annee) + 1, 1, 1, Hour(Annee), Minute(Annee), Second(Annee))
        Else
          Annee = Date(Year(Annee), Month(Annee), Day(Annee) + 1, Hour(Annee), Minute(Annee), Second(Annee))
        EndIf
      Case 2
        If Day(Annee) = 29 ; année bissextile
          Annee = Date(Year(Annee), Month(Annee) + 1, 1, Hour(Annee), Minute(Annee), Second(Annee))
        ElseIf Day(Annee) = 28
          ; Est-ce une année bissextile
          If Bissextile(Annee)
            Annee = Date(Year(Annee), Month(Annee), Day(Annee) + SiBissextile(Annee), Hour(Annee), Minute(Annee), Second(Annee))
          Else
            Annee = Date(Year(Annee), Month(Annee) + 1, 1, Hour(Annee), Minute(Annee), Second(Annee))
          EndIf
        Else
          Annee = Date(Year(Annee), Month(Annee), Day(Annee) + 1, Hour(Annee), Minute(Annee), Second(Annee))
        EndIf
    EndSelect
  Next
  ProcedureReturn Annee
EndProcedure

; Heures
Procedure.i IncrementerHeures(Annee = -1, Nombre_d_heures = 1)
  If Annee < 0
    Annee = Year(Date())
  EndIf  
  If (Hour(Annee) + Nombre_d_heures) / 24
    Annee = IncrementerJours(Annee, (Hour(Annee) + Nombre_d_heures) / 24)
  EndIf
  ProcedureReturn Date(Year(Annee), Month(Annee), Day(Annee), (Hour(Annee) + Nombre_d_heures) % 24, Minute(Annee), 
                       Second(Annee)) 
EndProcedure

; Minutes
Procedure.i IncrementerMinutes(Annee = -1, Nombre_de_Minutes = 1)
  If Annee < 0
    Annee = Year(Date())
  EndIf  
  If (Minute(Annee) + Nombre_de_Minutes) / 60
    Annee = IncrementerHeures(Annee, (Minute(Annee) + Nombre_de_Minutes) / 60)
  EndIf
  ProcedureReturn Date(Year(Annee), Month(Annee), Day(Annee), Hour(Annee), (Minute(Annee) + Nombre_de_Minutes) % 60, Second(Annee)) 
EndProcedure

; Secondes 
Procedure.i IncrementerSecondes(Annee = -1, Nombre_de_Secondes = 1)
  If Annee < 0
    Annee = Year(Date())
  EndIf  
  If (Second(Annee) + Nombre_de_Secondes) / 60
    Annee = IncrementerMinutes(Annee, (Second(Annee) + Nombre_de_Secondes) / 60)
  EndIf
  ProcedureReturn Date(Year(Annee), Month(Annee), Day(Annee), Hour(Annee), Minute(Annee), (Second(Annee) + Nombre_de_Secondes) % 60) 
EndProcedure

; Dates
Procedure.i IncrementerDate(Annee = -1, Nombre_d_annees = 0, Nombre_de_mois = 0, Nombre_de_jours = 0, Nombre_d_heures = 0, Nombre_de_Minutes = 0, Nombre_de_Secondes = 0)
  If Annee < 0
    Annee = Year(Date())
  EndIf  
  If Nombre_d_annees
    Annee = IncrementerAnnees(Annee, Nombre_d_annees)
  EndIf
  If Nombre_de_mois
    Annee = IncrementerMois(Annee, Nombre_de_mois)
  EndIf
  If Nombre_de_jours
    Annee = IncrementerJours(Annee, Nombre_de_jours)
  EndIf
  If Nombre_d_heures
    Annee = IncrementerHeures(Annee, Nombre_d_heures)
  EndIf
  If Nombre_de_Minutes
    Annee = IncrementerMinutes(Annee, Nombre_de_Minutes)
  EndIf
  If Nombre_de_Secondes
    Annee = IncrementerSecondes(Annee, Nombre_de_Secondes)
  EndIf
  ProcedureReturn Annee
EndProcedure

Procedure.i DateDiff(dateAvant, dateApres, *diff.DiffTemps) 
  
  Protected TotalJours,Annees,Mois,JoursRestants,Heures,Minutes,Secondes,DateCourante, dateTest, jourDebut
  
  If dateAvant > dateApres
    Swap dateAvant, dateApres
  EndIf
  
  DateCourante = dateAvant 
  dateTest = dateAvant 
  jourDebut = Day(dateAvant) 
  TotalJours = 0
  JoursRestants = 0 
  
  While dateTest <= dateApres 
    dateTest = AddDate(DateCourante, #PB_Date_Day, 1) 
    If dateTest <= dateApres 
      DateCourante = dateTest 
      TotalJours+1 
      JoursRestants+1
      If Day(DateCourante) = jourDebut 
        Mois+1 
        JoursRestants=0 
      EndIf 
    EndIf 
  Wend 
  
  dateTest = DateCourante 
  Heures = 0 
  While dateTest<dateApres 
    dateTest = AddDate(DateCourante, #PB_Date_Hour, 1) 
    If dateTest <= dateApres 
      DateCourante = dateTest 
      Heures+1 
    EndIf 
  Wend 
  
  dateTest = DateCourante
  Minutes = 0 
  While dateTest<dateApres 
    dateTest = AddDate(DateCourante, #PB_Date_Minute, 1) 
    If dateTest <= dateApres 
      DateCourante = dateTest 
      Minutes+1 
    EndIf 
  Wend 
  
  dateTest = DateCourante 
  Secondes = 0 
  While dateTest<dateApres 
    dateTest = AddDate(DateCourante, #PB_Date_Second, 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 
  
EndProcedure

Procedure.i AnalyserDate(Date$)
  Protected Resultat
  Resultat = ParseDate("%dd/%mm/%yyyy", Date$)
  ProcedureReturn Resultat
EndProcedure

Procedure.s ComparerDates(Date1$, Date2$)
  If ParseDate("%dd/%mm/%yyyy", Date1$) > ParseDate("%dd/%mm/%yyyy", Date2$)
    ProcedureReturn date1$ + " > " + date2$
  ElseIf ParseDate("%dd/%mm/%yyyy", Date1$) < ParseDate("%dd/%mm/%yyyy", Date2$)
    ProcedureReturn date1$ + " < " + date2$
  ElseIf  ParseDate("%dd/%mm/%yyyy", Date1$) = ParseDate("%dd/%mm/%yyyy", Date2$)
    ProcedureReturn date1$ + " = " + date2$
  EndIf
EndProcedure

Procedure.i CalculerAge(jour_naissance.b,mois_naissance.b,annee_naissance.q)
  Protected aujourdhui = Date()
  Protected ce_jour = Day(aujourdhui)
  Protected ce_mois = Month(aujourdhui)
  Protected cette_annee = Year(aujourdhui)
  Protected j = ce_jour - jour_naissance
  Protected m = ce_mois - mois_naissance
  Protected a = cette_annee - annee_naissance
  
  ProcedureReturn a
  
EndProcedure

Procedure.i 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

Procedure.i 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

Procedure.i 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

Procedure.i 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

Procedure.i TrouverDernierDimanche(Annee, Mois)
  Protected Jour=JoursDansMois(mois)
  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
  ;drawvectortext(DateDernierDimanche
  ;If DateDernierDimanche <> -1
  ProcedureReturn DateDernierDimanche
  ;EndIf  
  
EndProcedure

Procedure.s TrouverPremierJourSemaine(Annee, Mois, Joursem)
  Protected Jour=1
  Protected DatePremierJourSemaine=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le premier JourSemaine
  While DayOfWeek(DatePremierJourSemaine)<>Joursem
    
    jour + 1
    DatePremierJourSemaine= Date(Annee, mois, jour, 0, 0, 0)
  Wend
  
  ProcedureReturn FormatDate("%dd/%mm/%yyyy", DatePremierJourSemaine)
  
EndProcedure

Procedure.s TrouverDeuxiemeJourSemaine(Annee, Mois, Joursem)
  Protected Jour=8
  Protected DateDeuxiemeJourSemaine=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le deuxième JourSemaine
  While DayOfWeek(DateDeuxiemeJourSemaine)<>Joursem
    
    jour + 1
    DateDeuxiemeJourSemaine= Date(Annee, mois, jour, 0, 0, 0)
  Wend
  
  ProcedureReturn FormatDate("%dd/%mm/%yyyy", DateDeuxiemeJourSemaine)
  
EndProcedure

Procedure.s TrouverTroisiemeJourSemaine(Annee, Mois, Joursem)
  Protected Jour=15
  Protected DateTroisiemeJourSemaine=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le Troisième JourSemaine
  While DayOfWeek(DateTroisiemeJourSemaine)<>Joursem
    
    jour + 1
    DateTroisiemeJourSemaine= Date(Annee, mois, jour, 0, 0, 0)
  Wend
  
  ProcedureReturn FormatDate("%dd/%mm/%yyyy", DateTroisiemeJourSemaine)
  
EndProcedure

Procedure.s TrouverQuatriemeJourSemaine(Annee, Mois, Joursem)
  Protected Jour=22
  Protected DateQuatriemeJourSemaine=Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le Quatrième JourSemaine
  While DayOfWeek(DateQuatriemeJourSemaine)<>Joursem
    
    jour + 1
    DateQuatriemeJourSemaine= Date(Annee, mois, jour, 0, 0, 0)
  Wend
  
  ProcedureReturn FormatDate("%dd/%mm/%yyyy", DateQuatriemeJourSemaine)
  
EndProcedure

Procedure.s TrouverCinquiemeJourSemaine(Annee, Mois, Joursem)
  Protected Jour = JoursDansMois(Annee, Mois)
  Protected DateCinquiemeJourSemaine
  
  ;Chercher le CinquiemeJourSemaine
  DateCinquiemeJourSemaine = AddDate(ParseDate("%dd/%mm/%yyyy", TrouverQuatriemeJourSemaine(Annee, Mois, Joursem)), #PB_Date_Week, 1)
  If Val(Mid(FormatDate("%dd/%mm/%yyyy", DateCinquiemeJourSemaine), 4, 2)) = Mois
    ProcedureReturn FormatDate("%dd/%mm/%yyyy", DateCinquiemeJourSemaine)
  Else
    ProcedureReturn ""
  EndIf  
  
EndProcedure

Procedure ChercherVendredi13(Annee, Mois)
  Protected Jour=13
  Protected DateVendredi13 = Date(Annee, Mois, Jour, 0, 0, 0)
  
  ;Cherche le vendredi 13
  While DayOfWeek(DateVendredi13) <> 5    
    jour + 1
    DateVendredi13 = Date(annee, mois, jour, 0, 0, 0)
  Wend
  
  ProcedureReturn DateVendredi13
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$ Saison(_Jour, _Mois)
  Protected$ _Resultat
  If (_Jour < 31 And _Mois < 3) Or (_Jour < 20 And _Mois = 3)
    _Resultat = "Hiver"
  ElseIf (_Jour >= 20 And _Mois = 3) Or (_Jour < 19 And _Mois = 6)
    _Resultat = "Printemps"
  ElseIf (_Jour > 22 And _Mois = 6) Or (_Jour < 22 And _Mois = 9)
    _Resultat = "Été"
  ElseIf (_Jour > 21 And _Mois = 9) Or (_Jour < 21 And _Mois = 12)
    _Resultat = "Automne"
  ElseIf (_Jour > 21 And _Mois = 12)
    _Resultat = "Hiver"
  EndIf
  ProcedureReturn _Resultat
EndProcedure

Procedure$ TxtSaison(nJour, nMois) ;Permet de déterminer la saison correspondant au jour et au mois donnés
  Protected$ sResultat
  
  i = Annee - 2016
  
  If (nJour >= Day(*Saison\Printemps[i]) And nMois = 3) Or nMois = 4 Or nMois = 5 Or (nJour < Day(*Saison\Ete[i]) And nMois = 6)
    sResultat = "printemps"
  ElseIf (nJour >= Day(*Saison\Ete[i]) And nMois = 6) Or nMois = 7 Or nMois = 8 Or (nJour < Day(*Saison\Automne[i]) And nMois = 9)
    sResultat = "été"
  ElseIf (nJour >= Day(*Saison\Automne[i]) And nMois = 9) Or nMois = 10 Or nMois = 11 Or (nJour < Day(*Saison\Hiver[i]) And nMois = 12)
    sResultat = "automne"
  ElseIf (nJour >= Day(*Saison\Hiver[i]) And nMois = 12) Or nMois = 1 Or nMois = 2 Or (nJour < Day(*Saison\Printemps[i]) And nMois = 3)
    sResultat = "hiver"
  EndIf
  ProcedureReturn sResultat
EndProcedure

Procedure$ Article_Saison(jour, mois)
  Protected texte$
  Select TxtSaison(jour, mois)
    Case "printemps"
      texte$ = "au "
    Case "été", "automne", "hiver"
      texte$ = "en "
  EndSelect
  ProcedureReturn texte$ + TxtSaison(jour, mois)
EndProcedure

Procedure$ Article_Astro(jour, mois)
  Protected texte$
  Select SigneAstro(jour, mois)
    Case "Bélier", "Taureau", "Cancer", "Lion", "Scorpion", "Sagittaire", "Capricorne", "Verseau"
      texte$ = "du "
    Case "Gémeaux", "Poissons"
      texte$ = "des "
    Case "Vierge", "Balance"
      texte$ = "de la "
  EndSelect
  ProcedureReturn texte$ + SigneAstro(jour, mois)
EndProcedure

Procedure.s NomJourSemaine(Annee=-1,Mois=-1,Jour=-1)
  Protected _Annee_, _Mois_, _Jour_, _JS_.s
  If _Annee_<=0
    _Annee_ = Annee() ; Cette année
  EndIf
  
  If _Mois_<=0
    _Mois_ = Mois() ;Ce mois-ci
  EndIf
  
  If _Jour_ <=0
    _Jour_ = Jour() ;aujourd'hui
  EndIf
  
  _JS_ = StringField(NomJours$, DayOfWeek(Date(_Annee_, _Mois_, _Jour_, 0, 0, 0)) + 1, " ")
  ;drawvectortext(""+_Jour_+" "+_Mois_+" "+_Annee_
  ProcedureReturn _JS_
  
EndProcedure

Procedure.s ZoneFuseau()
  ; Retourne le nom du fuseau horaire
  ; www.purebasic.fr/english/viewtopic.php?p=181541
  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.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. DecalageHoraire(2)=DecalageHoraire(1)+DecalageHoraire(3)
  ; L'heure UTC utilisée est appelée GMT
  ; www.purebasic.fr/english/viewtopic.php?t=17158
  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 CalculerSoleil (lat.f, lon.f, JA.i, 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 ( Valeur positive, Nord de l'Equateur )      [E] = Hemisphere Est ( Valeur positive, à l'Est du Premier Méridien )
  ;[S] = Hemisphere Sud  ( - Valeur négative, Sud fr l'Equateur )     [O] = Hemisphere Ouest ( - Valeur négative , à l'Oest du Premier Méridien )
  ; 
  
  If JA = 0
    JA = DayOfYear(Date())
  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    ;
  
  ;~~~~~ Coucher
  UMOZ=12+DiffJour-Jourglg;
  Coucher=UMOZ-lon/15+tz-12;
  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.i, tz.d)
  CalculerSoleil (lat.f, lon.f, JA.i, tz.d)
  ProcedureReturn *Soleil\Lever$  
EndProcedure

Procedure.s Coucher_Soleil(lat.f, lon.f, JA.i, tz.d)
  CalculerSoleil (lat.f, lon.f, JA.i, tz.d)
  ProcedureReturn *Soleil\Coucher$  
EndProcedure

Procedure.i MonJDS (date.i)
  Protected d.i
  
  d = DayOfWeek(date)
  If d = 0
    d = 7             ; pour le dimanche, retourne 7 au lieu de 0
  EndIf
  ProcedureReturn d
EndProcedure


Procedure.i NumSem(date.i)
  ; Les calculs sont basés sur le fait que la première semaine de l'année
  ; contient toujours le 4 Janvier.
  ; [conformément à http://en.wikipedia.org/wiki/Seven-day_week#Week_numbering
  ;  ou mieux    http://de.wikipedia.org/wiki/Woche#Kalenderwoche]
  
  Protected jda.i=DayOfYear(date), annee.i=Year(date)
  Protected DernPrec.i  ; dernier jour de la dernière semaine de l'année précédente
  Protected DernCour.i  ; dernier jour de la dernière semaine de l'année en cours
  
  DernPrec = 4 - MonJDS(Date(annee, 1, 4, 0,0,0))
  DernCour = 4 - MonJDS(Date(annee,12,28, 0,0,0)) + DayOfYear(Date(annee,12,31, 0,0,0))
  
  If jda <= DernCour
    If jda <= DernPrec
      ; Le jour donné est dans la dernière semaine de l'année précédente.
      jda + DayOfYear(Date(annee-1,12,31, 0,0,0))
      DernPrec = 4 - MonJDS(Date(annee-1,1,4, 0,0,0))
    EndIf
    ProcedureReturn Round((jda-DernPrec)/7, #PB_Round_Up)
  Else
    ; Le jour donné est dans la première semaine de l'année prochaine.
    ProcedureReturn 1
  EndIf
EndProcedure

Procedure CalculerNumSem()
  Protected j
  For j = 1 To 12
    For i = 1 To JoursDansMois(Year(Date()), j)
      MaDonnee(W-1)\Jour = i
      MaDonnee(W-1)\Mois = j
      MaDonnee(W-1)\NSem = NumSem(Date(Year(Date()), j, i, 0, 0, 0))
      W + 1
    Next i
  Next j 
EndProcedure

CompilerIf #PB_Compiler_IsMainFile
  
  ;- Programme principal
  Enumeration Fenetre
    #fenetre_principale
    #fenetre_secondaire
  EndEnumeration
  
  Enumeration 0 Step 12 ;Gadgets
    #Txt
  EndEnumeration
  
  Enumeration #PB_Compiler_EnumerationValue ;Gadgets
    #Bouton_Ok
    #jour
    #valider
  EndEnumeration
  
  Enumeration mois
    #Janvier = 1
    #fevrier
    #Mars
    #Avril
    #Mai
    #Juin
    #Juillet
    #Aout
    #Septembre
    #Octobre
    #Novembre
    #Decembre
  EndEnumeration
  
  Enumeration
    #Police
  EndEnumeration  
  
  Enumeration
    #Faux
    #Vrai
  EndEnumeration
  
  ;SiBissextile() ; savoir si l'année en cours est bissextile
  
  LoadFont(#Police, "Calibri", 20,#PB_Font_Bold)
  SetGadgetFont(#PB_Default, FontID(#Police))
  
  Global Couleur =  2865001
  Global Quitter.i = #Faux
  Global Annee_courante$ = Str(Year(Date())), fin.i,Masque$ = "%dddd %dd %mmmm %yyyy", texte$ = "", texte2$ = "", jour, mois
  
  Declare Suite()
  
  If OpenWindow(#fenetre_principale, 510, 0, 800, 600 , "Fonction de Dates")
    SetWindowColor(#fenetre_principale, Couleur) 
    
    TextGadget(#Txt, 10, 20, 780, 30, "DDA() Début de l'année courante :  " + DDA(), #PB_Text_Center)
    SetGadgetColor(#Txt,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+1, 10, 60, 780, 30, "FDA() Fin de l'année courante :  " + FDA(), #PB_Text_Center)
    SetGadgetColor(#Txt+1,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+2, 10, 100, 780, 30, "DDM() Début du mois courant : " + DDM(), #PB_Text_Center)
    SetGadgetColor(#Txt+2,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+3, 10, 140, 780, 30, "FDM() Fin du mois courant : " + FDM(), #PB_Text_Center)
    SetGadgetColor(#Txt+3,  #PB_Gadget_BackColor, Couleur)
    If JDA() = 1
      texte$ = "er"
    Else  
      texte$ = "ème"
    EndIf  
    TextGadget(#Txt+4, 10, 180, 780, 30, "JDA() Nous sommes le " + Str(JDA()) + texte$ + 
                                         " jour de l'année",#PB_Text_Center)
    SetGadgetColor(#Txt+4,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+5, 10, 220, 780, 30, "JourRestantAnnee() Il en reste encore: " + 
                                         Str(JourRestantAnnee()),#PB_Text_Center)
    SetGadgetColor(#Txt+5,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+6, 10, 260, 780, 30, "NumSemaine() Semaine N° : " + Str(NumSemaine()), #PB_Text_Center)
    SetGadgetColor(#Txt+6,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+7, 10, 300, 780, 30, "NbSemRestant() Il en reste : " + Str(NbSemRestant()), #PB_Text_Center)
    SetGadgetColor(#Txt+7,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+8, 10, 340, 780, 30, "JDS() Aujourd'hui nous sommes un : " + JDS(), #PB_Text_Center)
    SetGadgetColor(#Txt+8,  #PB_Gadget_BackColor, Couleur)
    TextGadget(#Txt+9, 10, 380, 780, 30, "Jour() Aujourd'hui, nous sommes le : " + Str(Jour()),#PB_Text_Center)
    SetGadgetColor(#Txt+9, #PB_Gadget_BackColor, Couleur)
    If Mois() = 4 Or Mois() = 8 Or Mois() = 10
      texte$ = "d'"
    Else
      texte$ = "de "
    EndIf  
    TextGadget(#Txt+10, 10, 420, 780, 30, "NomMois$() Nous sommes au mois "+ texte$ + NomMois(), #PB_Text_Center)
    SetGadgetColor(#Txt+10, #PB_Gadget_BackColor, Couleur)
    If JourRestantMois(Mois()) <= 1
      texte$ = " jour"
    Else
      texte$ = " jours"
    EndIf
    TextGadget(#Txt+11, 10, 460, 780, 30, "JourRestantMois() : " + Str(JourRestantMois(Mois())) + texte$, #PB_Text_Center)
    SetGadgetColor(#Txt+11, #PB_Gadget_BackColor, Couleur)
    ButtonGadget(#Bouton_Ok, 370, 540, 70, 30, "Ok")
    SetActiveGadget(#Bouton_Ok)    
    
    Global d = Date(), d1, dateAvant, dateApres, EventID, MaDiff.DiffTemps, date1$, date2$
    
    dateAvant = ParseDate("%dd/%mm/%yyyy/%hh:%ii:%ss", "25/12/2018/21:45:00") 
    dateApres = Date()
    
    Suite()
    
    Quitter = #Faux ; place une variable à 0 pour la rendre non vraie, 
                    ;bon pour une manière différente de sortir d'un programme
    
    ;boucle principale
    Repeat
      If EventID = #PB_Event_Gadget ; vérifie pour voir si un gadget a été pressé
        Select EventGadget()
          Case #Bouton_Ok ; vérifie si #Bouton_Ok ou (bouton OK) a été pressé
                          ; si le #Bouton_Ok a été pressé faire ce qui est indiqué ici
                          ; jusqu'au prochain Case
            Quitter = #Vrai
            End
          Case #PB_Event_CloseWindow
            Quitter = #Vrai
        EndSelect
        
      EndIf
      EventID = WaitWindowEvent() ; Bloque l'exécution du programme jusqu'à ce qu'un évènement intervienne
      
    Until EventID = #PB_Event_CloseWindow Or Quitter = #Vrai
  EndIf
  FreeFont(#Police)
  End ; Fin du programme
  
  Procedure Suite()
    OpenWindow(#fenetre_secondaire, 0, 0, 500, 1040, "", #PB_Window_SystemMenu)
    
    X = 10 : Y = 0
    
    StartVectorDrawing(WindowVectorOutput(#fenetre_secondaire))
    VectorFont(FontID(#Police),15)
    VectorSourceColor($FF000000)
    
    Annee = Val(InputRequester("Vendredi 13", "Quelle année ?", Str(Year(Date()))))
    
    If Annee > 1970 And Annee < 2038
      For Mois = #Janvier To #Decembre
        Global vendredi13 =  ChercherVendredi13(Annee, Mois)
        
        If Day(Vendredi13) = 13
          Y + VectorTextHeight(" ")
          MovePathCursor(X,Y)
          DrawVectorText("vendredi "+FormatDate("%dd", Vendredi13)+" "+StringField(NomMois$,mois," ")+" "+Annee)
        EndIf 
        
      Next Mois  
    EndIf
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Question:
    Global JourSemaine = Val(InputRequester("Question","quel jour de semaine 0=dimanche, 6=samedi ?", "0"))
    
    If JourSemaine < 0 Or JourSemaine > 6
      Goto Question
    EndIf  
    
    Global JourSemaine$ = StringField(NomJours$, JourSemaine + 1, " ")
    
    Question_2:
    Annee = Val(InputRequester("Du premier au dernier " + JourSemaine$, "Quelle année ? 1970-2037", Str(Year(Date()))))
    
    If annee < 1970 Or Annee > 2037
      Goto Question_2
    EndIf
    
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Tous les " + JourSemaine$ + "s de " + Annee + #CRLF$)
    
    For i = #janvier To #Decembre
      Global PremierJourSemaine.s = TrouverPremierJourSemaine(Annee, i, JourSemaine)
      Global DeuxiemeJourSemaine.s = TrouverDeuxiemeJourSemaine(Annee, i, JourSemaine)
      Global TroisiemeJourSemaine.s = TrouverTroisiemeJourSemaine(Annee, i, JourSemaine)
      Global QuatriemeJourSemaine.s = TrouverQuatriemeJourSemaine(Annee, i, JourSemaine)
      Global CinquiemeJourSemaine.s = TrouverCinquiemeJourSemaine(Annee, i, JourSemaine)
      Global texte$ = PremierJourSemaine  + " " + DeuxiemeJourSemaine + " " + TroisiemeJourSemaine + " " + QuatriemeJourSemaine + " " + CinquiemeJourSemaine
      
      Y + VectorTextHeight(" ")
      MovePathCursor(X,Y)
      DrawVectorText(texte$)
    Next i
    
    Question_3:
    Z = Val(InputRequester("Saisons", "De quelle année ? 2016-2035", Str(Year(Date()))))
    
    If Z < 2016 Or Z > 2035
      Goto Question_3
    EndIf
    
    Z - 2016
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    With *Saison
      Y + VectorTextHeight(" ")
      MovePathCursor(X,Y)
      DrawVectorText("Printemps : " + ChaineDate(Masque$,\Printemps[Z]))
      Y + VectorTextHeight(" ")
      MovePathCursor(X,Y)
      DrawVectorText("Eté : " + ChaineDate(Masque$,\Ete[Z]))
      Y + VectorTextHeight(" ")
      MovePathCursor(X,Y)
      DrawVectorText("Automne : " + ChaineDate(Masque$,\Automne[Z]))
      Y + VectorTextHeight(" ")
      MovePathCursor(X,Y)
      DrawVectorText("Hiver : " + ChaineDate(Masque$,\Hiver[Z]))
    EndWith
    
    Day(*Saison\Printemps[Z])
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Aujourd'hui à Coutances " + Lever_Soleil(49.053546,-1.432954, DayOfYear(Date()), 1) + " - " + Coucher_Soleil(49.053546,-1.432954, DayOfYear(Date()), 1)) ;coordonnées du 13 avenue J-F Millet
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Aujourd'hui à Poitiers " + CalculerSoleil(46.58055,-0.33972, DayOfYear(Date()), 1))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Aujourd'hui à Marseille " + CalculerSoleil(43.29667, -4.63139, DayOfYear(Date()), 1))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    d1 = IncrementerDate(d, 0, 0, 326, 0, 0, 0)
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText( "IncrementerDate(" + FormatDate("%dd/%mm/%yyyy", d) + ", 0, 0, 326, 0, 0, 0)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("326 jours, après le " + FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", d))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("nous serons le :    " + FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", d1))    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("AddDate(" + FormatDate("%dd/%mm/%yyyy", d) + ", #PB_Date_Day, 326)")
    d = Date()
    d1 = AddDate(d, #PB_Date_Day, 326)
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("326 jours, après le " + FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", d))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("nous serons le : " + FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss", d1))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    DateDiff(dateAvant,dateApres,@MaDiff)
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)    
    DrawVectorText("Date à analyser: "+FormatDate("%dd/%mm/%yyyy %hh:%ii:%ss",dateAvant))    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Total de Jours: " + Str(MaDiff\TotalJours) + ", ce qui nous donne :")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\Annees) + " an(s)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\Mois) + " mois")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\JoursRestants) + " jour(s)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\Heures) + " heure(s)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\Minutes) + " minute(s)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(Str(MaDiff\Secondes) + " seconde(s)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("AnalyserDate")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Au 1  avril  1970  :          " + AnalyserDate("01/01/1970"))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Au 1 janvier 2015  : " + AnalyserDate("01/01/2015"))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("    Aujourd'hui    : " + AnalyserDate(FormatDate("%dd/%mm/%yyyy", d)))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Au 19 janvier 2038 : " + AnalyserDate("19/01/2038"))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("ComparerDates")
    date1$ = "17/11/2015"
    date2$ = "17/11/2016"
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(ComparerDates(date1$,date2$))
    date1$ = "17/11/2016"
    date2$ = "17/11/2015"
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(ComparerDates(date1$,date2$))
    date1$ = "17/11/2016"
    date2$ = "17/11/2016"
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText(ComparerDates(date1$,date2$))
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)    
    DrawVectorText("")
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("CalculerAge(19, 6, 1950)")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Micoute a " + CalculerAge(19,6,1950)+ " ans, cette année")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    
    Mois = 2 : Jour = 24    
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Une personne qui est née un " + Jour + " " + TabNomMois$(0, mois) + " est née " + Article_Saison(jour, mois) + ", sous le signe " + Article_Astro(jour, mois))
    Mois = 8 : Jour = 21
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Une personne qui est née un " + Jour + " " + TabNomMois$(0, mois) + " est née " + Article_Saison(jour, mois) + ", sous le signe " + Article_Astro(jour, mois))
    Mois = 8 : Jour = 22
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Une personne qui est née un " + Jour + " " + TabNomMois$(0, mois) + " est née " + Article_Saison(jour, mois) + ", sous le signe " + Article_Astro(jour, mois))
    Mois = 8 : Jour = 24
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Une personne qui est née un " + Jour + " " + TabNomMois$(0, mois) + " est née " + Article_Saison(jour, mois) + ", sous le signe " + Article_Astro(jour, mois))
    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Aujourd'hui nous sommes un "+NomJourSemaine())    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Zone fuseau horaire : " + ZoneFuseau())    
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Décalage horaire = " + DecalageHoraire(3) + "h")
    Y + VectorTextHeight(" ")
    MovePathCursor(X,Y)
    DrawVectorText("Semaine N° "  + MaDonnee(DayOfYear(Date()))\NSem)
    
    StopVectorDrawing()
  EndProcedure
  
CompilerEndIf
Il y a des exemples à la fin du code.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fonctions de dates

Message par Kwai chang caine »

Et ben !!!! si aprés ça on a encore une question à propos d'une date !!! 8O
Je savais même pas qu'on pouvait en dire autant, et pourtant en temps normal je peux faire un discours interminable à propos d'une seule sylabe :mrgreen:
L'avantage de donner whatmiles infos sur un sujet c'est que si tu t'es gouré "somewhere" ça se voit pas :lol:
En tout cas ... merci beaucoup du partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fonctions de dates

Message par Micoute »

Ravi que ça te plaise, j'espère tout cœur ne pas m'être gouré quelque part, car j'ai tout bien vérifié, mais dans ce monde, la perfection n'existe pas.
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 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fonctions de dates

Message par Kwai chang caine »

La preuve.....puisque moooaaa j'existe ... :mrgreen:
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Fonctions de dates

Message par Ar-S »

Encore une fois c'est du graphique donc un affichage foireux pour du windows > 100% d'affichage
Je poste une solutionici : http://www.purebasic.fr/french/viewtopi ... =6&t=16557
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
falsam
Messages : 7244
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Fonctions de dates

Message par falsam »

Une solution simple proposée par Gally que j'utilise dans mes applications pour palier à ce souci d'affichage.

Code : Tout sélectionner

Procedure.f AjustFontSize(Size.l)
  Define lPpp.l = GetDeviceCaps_(GetDC_(#Null), #LOGPIXELSX)
  ProcedureReturn (Size * 96) / lPpp
EndProcedure
Dans le code de Micoute il suffit de remplacer

Code : Tout sélectionner

LoadFont(#Police, "Calibri", 20,#PB_Font_Bold)
par

Code : Tout sélectionner

LoadFont(#police, "Calibri", AjustFontSize(20), #PB_Font_Bold)
Configuration : Windows 11 Famille 64-bit - PB 6.03 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: Fonctions de dates

Message par Kwai chang caine »

Je sais pas si les deux font exactement la même chose...mais au niveau du code y'a pas photo 8O
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Répondre