Comment afficher le fuseau horaire du système d'exploitation

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Comment afficher le fuseau horaire du système d'exploitation

Message par Micoute »

Bonjour à tous,

j'aimerais faire un programme qui calcule l'heure de fuseaux horaires sélectionné qui afficherait automatiquement dans le combo, le fuseau affiché par Windows 10.

C'est pour cette raison que je viens encore solliciter votre aide bienveillante et je vous en remercie par avance.

Code : Tout sélectionner

;Calculatrice Micoute (Fuseaux horaires)

Enumeration
  #Fenetre_Fuseaux
EndEnumeration

Enumeration
  #Ctn_Fuseaux
  #Txt_Comparer
  #Txt_Fuseau_base
  #Txt_Heure_base
  #Str_Heure_base
  #Cmb_FH_base
  #Spn_H_FH
  #Spn_Mn_FH
  #Spn_S_FH
  #Cmb_Fuseau_1
  #Cmb_Fuseau_2
  #Cmb_Fuseau_3
  #Cmb_Fuseau_4
  #Str_Fuseau_1
  #Str_Fuseau_2
  #Str_Fuseau_3
  #Str_Fuseau_4
  #Timer_FH
EndEnumeration

Enumeration Police
  #Police_1
  #Police_2
EndEnumeration  

Structure sFuseau
  Decalage.s
  Lieux.s
EndStructure

Structure sDecal
  Heure.i
  Minute.i
EndStructure  

LoadFont(#Police_1, "Arial", 8, #PB_Font_HighQuality)
LoadFont(#Police_2, "Arial", 12, #PB_Font_Bold)  

Declare Lire_Donnees()
Declare Ouvrir_Fenetre_Fuseaux()

Global Evenement, Dim Fuseaux.sFuseau(119), Dim HeureFuseau.i(119), Dim MinuteFuseau.i(119), I, ID
Global Dim JS.s(6), Dim NomMois.s(11)

JS(0) = "Dimanche" : JS(1) = "Lundi" : JS(2) = "Mardi" : JS(3) = "Mercredi" : JS(4) = "Jeudi" : JS(5) = "Vendredi" : JS(6) = "Samedi"
NomMois(0) = "janvier" : NomMois(1) = "février" : NomMois(2) = "mars" : NomMois(3) = "avril" : NomMois(4) = "mai" : NomMois(5) = "juin"
NomMois(6) = "juillet" : NomMois(7) = "août" : NomMois(8) = "septembre" : NomMois(9) = "octobre" : NomMois(10) = "novembre" : NomMois(11) = "décembre"

Procedure Lire_Donnees()
  Protected.s Dec, Lieu
  Restore Debut
  For i = 0 To ArraySize(Fuseaux())
    Read.s dec
    Fuseaux(i)\Decalage = "UTC"+Dec
    Read.s Fuseaux(i)\Lieux
  Next i
EndProcedure

Procedure Ouvrir_Fenetre_Fuseaux()
  If OpenWindow(#Fenetre_Fuseaux, 450, 200, 570, 250, "Fuseaux horaires", #PB_Window_SystemMenu|#PB_Window_TitleBar|#PB_Window_ScreenCentered)
    
    SetGadgetFont(#PB_Default, FontID(#Police_1))
    
    ContainerGadget(#Ctn_Fuseaux, 0, 0, 570, 250, #PB_Container_Raised)
    TextGadget(#Txt_Fuseau_base, 10, 0, 120, 30, "Fuseau horaire de base", #PB_Text_Right|#SS_CENTERIMAGE)
    ComboBoxGadget(#Cmb_FH_base, 140, 0, 420, 30)
    For i = 0 To ArraySize(Fuseaux())
      AddGadgetItem(#Cmb_FH_base, i, Fuseaux(i)\Decalage + " " + Fuseaux(i)\Lieux)
    Next i  
    
    TextGadget(#Txt_Heure_base, 10, 40, 120, 30, "Heure de base", #PB_Text_Right|#SS_CENTERIMAGE)
    StringGadget(#Str_Heure_base, 140, 40, 220, 30, "")
    SpinGadget(#Spn_H_FH, 380, 40, 60, 30, 0, 100, #PB_Spin_Numeric)
    SpinGadget(#Spn_Mn_FH, 440, 40, 60, 30, 0, 100, #PB_Spin_Numeric)
    SpinGadget(#Spn_S_FH, 500, 40, 60, 30, 0, 100, #PB_Spin_Numeric)
    
    TextGadget(#Txt_Comparer, 10, 70, 120, 30, "Comparer avec", #SS_CENTERIMAGE)
    ComboBoxGadget(#Cmb_Fuseau_1, 10, 100, 460, 30)
    StringGadget(#Str_Fuseau_1, 480, 100, 80, 30, "", #PB_String_ReadOnly)
    For i = 0 To ArraySize(Fuseaux())
      AddGadgetItem(#Cmb_Fuseau_1, i, Fuseaux(i)\Decalage + " " + Fuseaux(i)\Lieux)
    Next i
    ComboBoxGadget(#Cmb_Fuseau_2, 10, 135, 460, 30)
    StringGadget(#Str_Fuseau_2, 480, 135, 80, 30, "", #PB_String_ReadOnly)
    For i = 0 To ArraySize(Fuseaux())
      AddGadgetItem(#Cmb_Fuseau_2, i, Fuseaux(i)\Decalage + " " + Fuseaux(i)\Lieux)
    Next i
    ComboBoxGadget(#Cmb_Fuseau_3, 10, 170, 460, 30)
    StringGadget(#Str_Fuseau_3, 480, 170, 80, 30, "", #PB_String_ReadOnly)
    For i = 0 To ArraySize(Fuseaux())
      AddGadgetItem(#Cmb_Fuseau_3, i, Fuseaux(i)\Decalage + " " + Fuseaux(i)\Lieux)
    Next i
    ComboBoxGadget(#Cmb_Fuseau_4, 10, 205, 460, 30)
    StringGadget(#Str_Fuseau_4, 480, 205, 80, 30, "", #PB_String_ReadOnly)
    For i = 0 To ArraySize(Fuseaux())
      AddGadgetItem(#Cmb_Fuseau_4, i, Fuseaux(i)\Decalage + " " + Fuseaux(i)\Lieux)
    Next i
    
    CloseGadgetList()
    
    For i = #Str_Heure_base To #Str_Fuseau_4
      SetGadgetFont(i, FontID(#Police_2))
    Next i  
    
    AddWindowTimer(#Fenetre_Fuseaux, #Timer_FH, 1000)
  EndIf
EndProcedure

Lire_Donnees()
Ouvrir_Fenetre_Fuseaux()

Procedure Calcul(Id)
  HeureFuseau(ID) = (Val(Mid(GetGadgetText(Id), 4, 4))%24)+Hour(Date()) - 1
  MinuteFuseau(ID) = (Val(Mid(GetGadgetText(Id), 8, 4))%60)+Minute(Date())
  If MinuteFuseau(ID) > 60
  While MinuteFuseau(ID) >= 60
    MinuteFuseau(ID) - 60
    HeureFuseau(ID) + 1
  Wend 
  EndIf
EndProcedure

Procedure Calcul_Fuseau(n)  
  Global heureFuseau = (Val(Mid(Fuseaux(n)\Decalage, 4, 4))%24)+Hour(Date()) - 1
  Global minuteFuseau = (Val(Mid(Fuseaux(n)\Decalage, 8, 4))%60)+Minute(Date())
  If minuteFuseau > 60
    minuteFuseau - 60
    heureFuseau + 1
  EndIf  
EndProcedure

;- Boucle
Repeat
  Evenement = WaitWindowEvent()
  Select Evenement
      
    Case #PB_Event_Timer
      Select EventTimer()
        Case #Timer_FH
          Calcul(#Cmb_FH_base)
          If GetGadgetText(#Cmb_FH_base)
            SetGadgetText(#Str_Heure_base, JS(DayOfWeek(Date()))+" "+Str(Day(Date()))+" "+NomMois(Month(Date()))+" "+Str(Year(Date())))
            SetGadgetText(#Spn_H_FH, RSet(Str(HeureFuseau(#Cmb_FH_base)), 2, "0"))
            SetGadgetText(#Spn_Mn_FH, RSet(Str(MinuteFuseau(#Cmb_FH_base)), 2, "0"))
            SetGadgetText(#Spn_S_FH, RSet(Str(Second(Date())),2,"0"))
          EndIf
          If GetGadgetText(#Cmb_Fuseau_1)
            Calcul(#Cmb_Fuseau_1)
          SetGadgetText(#Str_Fuseau_1, RSet(Str(HeureFuseau(#Cmb_Fuseau_1)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_1)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
          EndIf
          If GetGadgetText(#Cmb_Fuseau_2)
            Calcul(#Cmb_Fuseau_2)
          SetGadgetText(#Str_Fuseau_2, RSet(Str(HeureFuseau(#Cmb_Fuseau_2)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_2)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
          EndIf
          If GetGadgetText(#Cmb_Fuseau_3)
            Calcul(#Cmb_Fuseau_3)
          SetGadgetText(#Str_Fuseau_3, RSet(Str(HeureFuseau(#Cmb_Fuseau_3)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_3)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
          EndIf
          If GetGadgetText(#Cmb_Fuseau_4)
            Calcul(#Cmb_Fuseau_4)
          SetGadgetText(#Str_Fuseau_4, RSet(Str(HeureFuseau(#Cmb_Fuseau_4)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_4)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
          EndIf
      EndSelect          
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case #Cmb_FH_base
          SetGadgetState(#Spn_H_FH, Val(Mid(GetGadgetText(#Cmb_FH_base), 4, 4))+Hour(Date()) - 1)
          SetGadgetState(#Spn_Mn_FH, Val(Mid(GetGadgetText(#Cmb_FH_base), 8, 4))+Minute(Date()))
          SetGadgetState(#Spn_S_FH, Second(Date()))
        Case #Cmb_Fuseau_1
          Calcul(#Cmb_Fuseau_1)
          SetGadgetText(#Str_Fuseau_1, RSet(Str(HeureFuseau(#Cmb_Fuseau_1)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_1)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
        Case #Cmb_Fuseau_2
          Calcul(#Cmb_Fuseau_2)
          SetGadgetText(#Str_Fuseau_2, RSet(Str(HeureFuseau(#Cmb_Fuseau_2)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_2)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
        Case #Cmb_Fuseau_3
          Calcul(#Cmb_Fuseau_3)
          SetGadgetText(#Str_Fuseau_3, RSet(Str(HeureFuseau(#Cmb_Fuseau_3)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_3)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
        Case #Cmb_Fuseau_4
          Calcul(#Cmb_Fuseau_4)
          SetGadgetText(#Str_Fuseau_4, RSet(Str(HeureFuseau(#Cmb_Fuseau_4)%24), 2, "0")+":"+RSet(Str(MinuteFuseau(#Cmb_Fuseau_4)%60), 2, "0") + ":" + RSet(Str(Second(Date())), 2, "0"))
      EndSelect
      
    Case #PB_Event_CloseWindow
      Select EventWindow()
        Case #Fenetre_Fuseaux
          CloseWindow(#Fenetre_Fuseaux)
          Break
      EndSelect
  EndSelect
ForEver

;- données
DataSection
  Debut:
  Data.s " 00:00", "Casablanca"
  Data.s " 00:00", "Dublin, Edimbourg, Lisbonne, Londres"
  Data.s " 00:00", "Monrovia, Reyjavik"
  Data.s "+01:00", "Affrique centrale - ouest"
  Data.s "+01:00", "Belgrade, Bratislava, Budapest, Ljubjana, Prague"
  Data.s "+01:00", "Bruxelles, Copenhague"
  Data.s "+01:00", "Madrid, Paris"
  Data.s "+01:00", "Sarajeva, Skpje, Varsovie, Zagreb"
  Data.s "+01:00", "Windhoek"
  Data.s "+02:00", "Amman"
  Data.s "+02:00", "Athènes, Bucarest"
  Data.s "+02:00", "Beyrouth"
  Data.s "+02:00", "Chisinau"
  Data.s "+02:00", "Damas"
  Data.s "+02:00", "Gaza, Hébron"
  Data.s "+02:00", "Hrare, Pretoria"
  Data.s "+02:00", "Helsinki, Kiev, Riga, Sofia, Tallin, Vilnius"
  Data.s "+02:00", "Jérusalem"
  Data.s "+02:00", "Kaliningrad"
  Data.s "+02:00", "Le Caire"
  Data.s "+02:00", "Tripoli"
  Data.s "+03:00", "Bagdad"
  Data.s "+03:00", "Istanbul"
  Data.s "+03:00", "Koweit, Riyad"
  Data.s "+03:00", "Misnk"
  Data.s "+03:00", "Moscou, Saint-Petersbourg, Volgograd"
  Data.s "+03:00", "Nairobi"
  Data.s "+03:30", "Téhéran"
  Data.s "+04:00", "Abu Dhabi, Muscat"
  Data.s "+04:00", "Astrajhan, Oulianovsk"
  Data.s "+04:00", "Bakou"
  Data.s "+04:00", "Erevan"
  Data.s "+04:00", "Izhevsk, Samara"
  Data.s "+04:00", "Port Louis"
  Data.s "+04:00", "Saratov"
  Data.s "+04:00", "Tbilissi"
  Data.s "+04:30", "Kaboul"
  Data.s "+05:00", "Achgabat, Tachkent"
  Data.s "+05:00", "Iekaterinbourg"
  Data.s "+05:00", "Islamabad, Karachi"
  Data.s "+05:30", "Chennai, Kolkata, Mumbai, New Delhi"
  Data.s "+05:30", "Sri Jayawardenepura"
  Data.s "+05:45", "Katmandou"
  Data.s "+06:00", "Astana"
  Data.s "+06:00", "Dhaka"
  Data.s "+06:00", "Omsk"
  Data.s "+06:30", "Rangoon"  
  Data.s "+07:00", "Bangkok, Hanoi, Djakarta"  
  Data.s "+07:00", "Barnaoul, Gorno-Altaïsk"
  Data.s "+07:00", "Hovd"
  Data.s "+07:00", "Krasnoïarsk"
  Data.s "+07:00", "Novosibirsk"
  Data.s "+07:00", "Tomsk"
  Data.s "+08:00", "Pékin, Chongqing, Hong Kong, Urumqi"
  Data.s "+08:00", "Irkoutsk"
  Data.s "+08:00", "Kuala Lumpur, Singapour"
  Data.s "+08:00", "Oulan-Bator"
  Data.s "+08:00", "Perth"
  Data.s "+08:00", "Taipei"
  Data.s "+08:30", "Pyongyang"
  Data.s "+08:45", "Eucla"
  Data.s "+09:00", "Chita"
  Data.s "+09:00", "Iakoutsk"
  Data.s "+09:00", "Osaka, Sapporo, Tokyo"
  Data.s "+09:00", "Séoul"
  Data.s "+09:30", "Adélaïde"
  Data.s "+09:30", "Darwin"
  Data.s "+10:00", "Brisbane"
  Data.s "+10:00", "Canberra, Melbourne, Sydney"
  Data.s "+10:00", "Guam, Port Moresby"
  Data.s "+10:00", "Hobort"
  Data.s "+10:00", "Vladivostok"
  Data.s "+10:30", "Île Lord Howe"
  Data.s "+11:00", "Chokurdakh"
  Data.s "+11:00", "Madagan"
  Data.s "+11:00", "Sakhaline"
  Data.s "+11:00", "Île Bougainville"
  Data.s "+11:00", "Île Norfolk"
  Data.s "+11:00", "Îles Salomon, Nouvelle-Calédonie"
  Data.s "+12:00", "Anadyr, Petropavlovsk-Kamtchatski"
  Data.s "+12:00", "Auckland, Wellington"
  Data.s "+12:00", "Fidji"
  Data.s "+12:45", "Îles Chatham"
  Data.s "+13:00", "Nuku'alofa"
  Data.s "+13:00", "Samoa"
  Data.s "+14:00", "Île Kiritimati"
  Data.s "-01:00", "Îles du Cap-Vert"
  Data.s "-01:00", "Les Açores"
  Data.s "-03:00", "Araguaina"
  Data.s "-03:00", "Brasilia"
  Data.s "-03:00", "Buenos Aires"
  Data.s "-03:00", "Cayenne, Fortaleza"
  Data.s "-03:00", "Groenland"
  Data.s "-03:00", "Montevideo"
  Data.s "-03:00", "Punta Arenas"
  Data.s "-03:00", "Saint-Pierre-et-Miquelon"
  Data.s "-03:00", "Salvador"
  Data.s "-03:00", "Terre-Neuve-et-Labrador"
  Data.s "-04:00", "Asuncion"
  Data.s "-04:00", "Caracas"
  Data.s "-04:00", "Cuiaba"
  Data.s "-04:00", "Georgetown, La Paz, Manaus, San Juan"
  Data.s "-04:00", "Santiago"
  Data.s "-04:00", "Îles Turques-et-Caïques"
  Data.s "-05:00", "Bogota, Lima, Quito, Rio Branco"
  Data.s "-05:00", "La Havane"
  Data.s "-05:00", "Haïti"
  Data.s "-06:00", "Île de Pâques"
  Data.s "-06:00", "Guadalajara, Mexico, Monterrey"
  Data.s "-06:00", "Saskatchewan"
  Data.s "-06:00", "Amérique centrale"
  Data.s "-07:00", "Arizona"
  Data.s "-07:00", "Chihuahua, Mazatlan"
  Data.s "-07:00", "Montagnes Rocheuses"
  Data.s "-08:00", "Basse Californie"
  Data.s "-08:00", "Pacifique, E.U., Canada"
  Data.s "-09:00", "Alaska"
  Data.s "-09:30", "Îlse Marquises"
  Data.s "-10:00", "Îles Aléoutiennes"
  Data.s "-10:00", "Hawaii"
  Data$ "Fin", ""
  Fin:
EndDataSection

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
Zorro
Messages : 2185
Inscription : mar. 31/mai/2016 9:06

Re: Comment afficher le fuseau horaire du système d'exploita

Message par Zorro »

juste un truc que tu fais souvent ...

au lieu d'utiliser un tableau a une dimension pour stocker des mois, ou des jours (donc avec peut d'elements)
il vaut mieux dans ce cas passer par une variable Chaine et utiliser Stringfield

c'est moins lourd qu'un tableau
et prends moins de place a ecrire

du coup tes :

Code : Tout sélectionner

;JS(0) = "Dimanche" : JS(1) = "Lundi" : JS(2) = "Mardi" : JS(3) = "Mercredi" : JS(4) = "Jeudi" : JS(5) = "Vendredi" : JS(6) = "Samedi"
deviennent :

Code : Tout sélectionner

JS.s="Dimanche,Lundi,Mardi,Mercredi,Jeudi,Vendredi,Samedi"

; pour accéder il suffit d'utiliser StringField()
; Exemple , je veux le troisieme element (Mardi) , je fais 
Debug Stringfield(JS.s,3,",")
et tes :

Code : Tout sélectionner

;NomMois(0) = "janvier" : NomMois(1) = "février" : NomMois(2) = "mars" : NomMois(3) = "avril" : NomMois(4) = "mai" : NomMois(5) = "juin"
;NomMois(6) = "juillet" : NomMois(7) = "août" : NomMois(8) = "septembre" : NomMois(9) = "octobre" : NomMois(10) = "novembre" : NomMois(11) = "décembre"

Deviennent :

Code : Tout sélectionner

NomMois.s="janvier,février,mars,avril,mai,juin,juillet,aout,septembre,octobre,novembre,decembre"

; si tu veux acceder a l'element 5 (Mai) tu fait juste :

Debug Stringfield(NomMois.s,5,",")

une chaine de caracteres ou de mots, peut etre considéré comme un tableau a une dimension
inutile de sortir l'armada DIM() etc...
tu sépares juste tes "elements" par un caractere comme "," mais ça peut etre n'importe quel autre caractere en fait ... :)
et Stringfield() est un "pointeur" sur l'un des éléments de ta chaine

bon c'etait juste une parenthese :)


tu vas aussi avoir un probleme avec les iles Marquises
car suivant l'ete ou l'hiver c'est :
Du dim. 1 janvier 2017 au dim. 26 mars 2017 : -11h30 de décalage
heure d'hiver en France (UTC+1)

Du dim. 26 mars 2017 au dim. 29 octobre 2017 : -12h30 de décalage
heure d'été en France (UTC+2)

Du dim. 29 octobre 2017 au dim. 31 décembre 2017 : -11h30 de décalage
heure d'hiver en France (UTC+1)

c'est complexe :)
Image
Image
Site: http://michel.dobro.free.fr/
Devise :"dis moi ce dont tu as besoin, je t'expliquerai comment t'en passer"
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Comment afficher le fuseau horaire du système d'exploita

Message par Micoute »

Merci Zorro pour cette astuce, ce sont des choses expliquées dans l'aide de PB, mais je suis victime de mes mauvaises habitudes, je vais en profiter pour en prendre de nouvelles.
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 !
Répondre