Code : Tout sélectionner
EnableExplicit
Define TIME_ZONE_INFORMATION.TIME_ZONE_INFORMATION
Select GetTimeZoneInformation_(TIME_ZONE_INFORMATION)
Case #TIME_ZONE_ID_UNKNOWN
Debug "Unknown"
Case #TIME_ZONE_ID_STANDARD
Debug "Heure d'hivers"
Case #TIME_ZONE_ID_DAYLIGHT
Debug "Heure d'été"
EndSelect
Code : Tout sélectionner
; Description: Returns the status of whether the current time is daylight saving time
; OS: Windows, Linux, Mac
; English-Forum:
; French-Forum:
; German-Forum:
; -----------------------------------------------------------------------------
; MIT License
;
; Copyright (c) 2017-2018 Sicro
;
; Permission is hereby granted, free of charge, to any person obtaining a copy
; of this software and associated documentation files (the "Software"), to deal
; in the Software without restriction, including without limitation the rights
; to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
; copies of the Software, and to permit persons to whom the Software is
; furnished to do so, subject to the following conditions:
;
; The above copyright notice and this permission notice shall be included in all
; copies or substantial portions of the Software.
;
; THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
; FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
; AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
; LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
; OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
; SOFTWARE.
Procedure.i IsDayLightSavingTime()
CompilerSelect #PB_Compiler_OS
CompilerCase #PB_OS_Windows
; https://msdn.microsoft.com/de-de/library/windows/desktop/ms724421(v=vs.85).aspx
Protected.TIME_ZONE_INFORMATION lpTimeZoneInformation
Select GetTimeZoneInformation_(@lpTimeZoneInformation)
Case #TIME_ZONE_ID_STANDARD : ProcedureReturn #False
Case #TIME_ZONE_ID_DAYLIGHT : ProcedureReturn #True
Case #TIME_ZONE_ID_UNKNOWN : ProcedureReturn -1
EndSelect
CompilerCase #PB_OS_Linux
; https://linux.die.net/man/2/time
; https://linux.die.net/man/3/localtime
CompilerIf Not Defined(tm, #PB_Structure)
Structure tm Align #PB_Structure_AlignC
tm_sec.l ; 0 à 59 ou jusqu'à 60 pour les secondes intercalaires
tm_min.l ; 0 à 59
tm_hour.l ; 0 à 23
tm_mday.l ; Jour du mois : 1 à 31
tm_mon.l ; Mmois : 0 à 11 (mois depuis janvier)
tm_year.l ; Nombre d'années depuis l'an 1900
tm_wday.l ; Jour de la semaine : 0 à 6, 0 = dimanche
tm_yday.l ; Jours depuis le début de l'année : 0 à 365 (donc 365 est 366 puisqu'il compte après le 1er janvier)
tm_isdst.l ; heure d'été ? tm_isdst > 0 = Oui
; tm_isdst = 0 = Non
; tm_isdst < 0 = inconnu
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
tm_gmtoff.l ; Décalage par rapport à UTC en secondes
*tm_zone ; Nom de l'abréviation du fuseau horaire
CompilerElse
tm_zone.l ; espace réservé
tm_gmtoff.l ; Décalage par rapport à UTC en secondes
*tm_zone64 ; Nom de l'abréviation du fuseau horaire
CompilerEndIf
EndStructure
CompilerEndIf
Protected.tm *CurrentTime = time_(0)
Protected.tm *LocalTime = localtime_(@*CurrentTime)
If *LocalTime\tm_isdst > 0
ProcedureReturn #True
ElseIf *LocalTime\tm_isdst = 0
ProcedureReturn #False
ElseIf *LocalTime\tm_isdst < 0
ProcedureReturn -1
EndIf
CompilerCase #PB_OS_MacOS
; http://www.purebasic.fr/english/viewtopic.php?p=410207#p410207
Protected TimeZoneObject = CocoaMessage(0, 0, "NSTimeZone systemTimeZone")
Protected DaylightSavingTime
CocoaMessage(@DaylightSavingTime, TimeZoneObject, "isDaylightSavingTime")
ProcedureReturn DaylightSavingTime
CompilerEndSelect
EndProcedure
;-Example
CompilerIf #PB_Compiler_IsMainFile
Select IsDayLightSavingTime()
Case #True : Debug "Heure d'été !"
Case #False : Debug "Heure d'hiver !"
Default : Debug "inconnu !"
EndSelect
CompilerEndIf
Code : Tout sélectionner
Procedure ChercheDernierDimanche(Annee, Mois)
Jour=31
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 HeureEte_ChangementdeDate(Date)
;Printemps :
;- passer de l'heure normale à l'heure d'été
;- l'horloge est avancée d'une heure à à 2h le dernier dimanche du mois de mars.
;Automne :
;- passer de l'heure d'été à l'heure normale
;- l'horloge est retardée d'une heure à 3h le dernier dimanche du mois d'octobre.
#Printemps = 3
#Automne = 10
; Annee = Val(InputRequester("Changement d'heure", "Quelle année ?", Str(Year(Date()))))
Annee = Date;Year(Date);Year(Date())
If Annee > 1970 And Annee < 2038
Dimanche = ChercheDernierDimanche(Annee, #Printemps)
Debug "Passage de l'heure normale à l'heure d'été = " + Str(Day(Dimanche)) + "/" + Str(Month(Dimanche)) + "/" + Str(Year(Dimanche))
Dimanche = ChercheDernierDimanche(Annee, #Automne)
Debug "Passage de l'heure d'été à l'heure normale = " + Str(Day(Dimanche)) + "/" + Str(Month(Dimanche)) + "/" + Str(Year(Dimanche))
EndIf
; Petit rappel sur l'heure d'été en France, elle ne date que depuis l'année 1976
; (sinon, elle avait aussi été en vigueur dans les années 1942 à 1945)
;
; je dois ajouter que la règle des dates a subit des variantes, exemple:
; de 1977 à 1980 c'était le premier week-end d'avril et le dernier de septembre
; ensuite le dernier week-End de septembre a continué d'être en vigueur jusque 1995 pour passer à fin octobre en 1996
;
; Cordialement
;
; Historique des dates:
; Année : 1976
; Passage à l'heure d'été le Dimanche 28 Mars 1976 - 00 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Samedi 25 Septembre 1976 - 23 h 00 (GMT + 1 h ) CET
; Année : 1977
; Passage à l'heure d'été le Dimanche 3 Avril 1977 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Septembre 1977 - 01 h 00 (GMT + 1 h ) CET
; Année : 1978
; Passage à l'heure d'été le Dimanche 2 Avril 1978 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 1 Octobre 1978 - 01 h 00 (GMT + 1 h ) CET
; Année : 1979
; Passage à l'heure d'été le Dimanche 1 Avril 1979 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 30 Septembre 1979 - 01 h 00 (GMT + 1 h ) CET
; Année : 1980
; Passage à l'heure d'été le Dimanche 6 Avril 1980 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 28 Septembre 1980 - 01 h 00 (GMT + 1 h ) CET
; Année : 1981
; Passage à l'heure d'été le Dimanche 29 Mars 1981 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Septembre 1981 - 01 h 00 (GMT + 1 h ) CET
; Année : 1982
; Passage à l'heure d'été le Dimanche 28 Mars 1982 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Septembre 1982 - 01 h 00 (GMT + 1 h ) CET
; Année : 1983
; Passage à l'heure d'été le Dimanche 27 Mars 1983 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Septembre 1983 - 01 h 00 (GMT + 1 h ) CET
; Année : 1984
; Passage à l'heure d'été le Dimanche 25 Mars 1984 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 30 Septembre 1984 - 01 h 00 (GMT + 1 h ) CET
; Année : 1985
; Passage à l'heure d'été le Dimanche 31 Mars 1985 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 29 Septembre 1985 - 01 h 00 (GMT + 1 h ) CET
; Année : 1986
; Passage à l'heure d'été le Dimanche 30 Mars 1986 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 28 Septembre 1986 - 01 h 00 (GMT + 1 h ) CET
; Année : 1987
; Passage à l'heure d'été le Dimanche 29 Mars 1987 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Septembre 1987 - 01 h 00 (GMT + 1 h ) CET
; Année : 1988
; Passage à l'heure d'été le Dimanche 27 Mars 1988 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Septembre 1988 - 01 h 00 (GMT + 1 h ) CET
; Année : 1989
; Passage à l'heure d'été le Dimanche 26 Mars 1989 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 24 Septembre 1989 - 01 h 00 (GMT + 1 h ) CET
; Année : 1990
; Passage à l'heure d'été le Dimanche 25 Mars 1990 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 30 Septembre 1990 - 01 h 00 (GMT + 1 h ) CET
; Année : 1991
; Passage à l'heure d'été le Dimanche 31 Mars 1991 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 29 Septembre 1991 - 01 h 00 (GMT + 1 h ) CET
; Année : 1992
; Passage à l'heure d'été le Dimanche 29 Mars 1992 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Septembre 1992 - 01 h 00 (GMT + 1 h ) CET
; Année : 1993
; Passage à l'heure d'été le Dimanche 28 Mars 1993 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Septembre 1993 - 01 h 00 (GMT + 1 h ) CET
; Année : 1994
; Passage à l'heure d'été le Dimanche 27 Mars 1994 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Septembre 1994 - 01 h 00 (GMT + 1 h ) CET
; Année : 1995
; Passage à l'heure d'été le Dimanche 26 Mars 1995 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 24 Septembre 1995 - 01 h 00 (GMT + 1 h ) CET
; Année : 1996
; Passage à l'heure d'été le Dimanche 31 Mars 1996 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Octobre 1996 - 01 h 00 (GMT + 1 h ) CET
; Année : 1997
; Passage à l'heure d'été le Dimanche 30 Mars 1997 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Octobre 1997 - 01 h 00 (GMT + 1 h ) CET
; Année : 1998
; Passage à l'heure d'été le Dimanche 29 Mars 1998 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Octobre 1998 - 01 h 00 (GMT + 1 h ) CET
; Année : 1999
; Passage à l'heure d'été le Dimanche 28 Mars 1999 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 31 Octobre 1999 - 01 h 00 (GMT + 1 h ) CET
; Année : 2000
; Passage à l'heure d'été le Dimanche 26 Mars 2000 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 29 Octobre 2000 - 01 h 00 (GMT + 1 h ) CET
; Année : 2001
; Passage à l'heure d'été le Dimanche 25 Mars 2001 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 28 Octobre 2001 - 01 h 00 (GMT + 1 h ) CET
; Année : 2002
; Passage à l'heure d'été le Dimanche 31 Mars 2002 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Octobre 2002 - 01 h 00 (GMT + 1 h ) CET
; Année : 2003
; Passage à l'heure d'été le Dimanche 30 Mars 2003 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Octobre 2003 - 01 h 00 (GMT + 1 h ) CET
; Année : 2004
; Passage à l'heure d'été le Dimanche 28 Mars 2004 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 31 Octobre 2004 - 01 h 00 (GMT + 1 h ) CET
; Année : 2005
; Passage à l'heure d'été le Dimanche 27 Mars 2005 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 30 Octobre 2005 - 01 h 00 (GMT + 1 h ) CET
; Année : 2006
; Passage à l'heure d'été le Dimanche 26 Mars 2006 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 29 Octobre 2006 - 01 h 00 (GMT + 1 h ) CET
; Année : 2007
; Passage à l'heure d'été le Dimanche 25 Mars 2007 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 28 Octobre 2007 - 01 h 00 (GMT + 1 h ) CET
; Année : 2008
; Passage à l'heure d'été le Dimanche 30 Mars 2008 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Octobre 2008 - 01 h 00 (GMT + 1 h ) CET
; Année : 2009
; Passage à l'heure d'été le Dimanche 29 Mars 2009 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 25 Octobre 2009 - 01 h 00 (GMT + 1 h ) CET
; Année : 2010
; Passage à l'heure d'été le Dimanche 28 Mars 2010 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 31 Octobre 2010 - 01 h 00 (GMT + 1 h ) CET
; Année : 2011
; Passage à l'heure d'été le Dimanche 27 Mars 2011 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 30 Octobre 2011 - 01 h 00 (GMT + 1 h ) CET
; Année : 2012
; Passage à l'heure d'été le Dimanche 25 Mars 2012 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 28 Octobre 2012 - 01 h 00 (GMT + 1 h ) CET
; Année : 2013
; Passage à l'heure d'été le Dimanche 31 Mars 2013 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 27 Octobre 2013 - 01 h 00 (GMT + 1 h ) CET
; Année : 2014
; Passage à l'heure d'été le Dimanche 30 Mars 2014 - 01 h 00 (GMT + 2 h ) CEST
; Retour à l'heure normale le Dimanche 26 Octobre 2014 - 01 h 00 (GMT + 1 h ) CET
EndProcedure
HeureEte_ChangementdeDate(2023)
Mon propre code
Code : Tout sélectionner
; Depuis 1996
; ; la période de l'heure d'été commence à 1 h UTC, le dernier dimanche de mars ;
; ; la période de l'heure d'été se termine à 1 h UTC, le dernier dimanche d'octobre.
; 2023 Début: 02:00 26 mars Fin: 03:00 29 octobre
Procedure HE(date)
;France
fuseau=1
hpassage=fuseau+1;1hutc
A=Year(Date)
M=Month(Date)
J=Day(date)
; 0 = Dimanche
; 1 : Lundi
; 2 : Mardi
; 3 : Mercredi
; 4 : Jeudi
; 5 : Vendredi
; 6 : Samedi
Tmpdate1=Date(A, 3, 31, hpassage, 0, 0)
dow1=DayOfWeek(Tmpdate1)
date1=Date(A, 3, 31-dow1, hpassage, 0, 0)
Tmpdate2=Date(A,10,31, hpassage, 0, 0)
dow2=DayOfWeek(Tmpdate2)
date2=Date(A,10,31-dow2, hpassage+1, 0, 0)
If (dow1>-1) And(dow2)>-1
If (date>=date1) And (date<=date2)
ProcedureReturn 1
Else
ProcedureReturn 0
EndIf
Else
Debug "erreur"
ProcedureReturn -1
EndIf
EndProcedure
result =HE(Date())
Debug result
Select result
Case 1
Debug"Heure GMT + 2 : Heure d'été"
Case 0
Debug"Heure GMT + 1 : Heure d'hiver"
Default
Debug "erreur"
EndSelect
M.