Windev : Serveur de temps de référence et date et heure UCT vers date et heure locale
Bonjour,
Voici une petite procédure permettant de récupérer une date et heure locale unique, qui ne dépend pas du paramétrage de l'horloge d'un poste (qui peut être mal réglée).
L'idée est de faire en sorte que tout les postes utilisant une même application aient un temps de référence unique.
La procédure récupère le temps UTC défini sur le serveur de google.fr, et le transforme en temps local, en y ajoutant le décalage lié au fuseau horaire et à l'heure d'été.
Pour ce faire, on peut aussi utiliser une api du type Google Maps Time Zone API, mais en version gratuite, le nombre de requêtes autorisées est limité à 2500 par jour.
A noter qu'il existe aussi des commandes Windows permettant d'interroger directement les serveurs de temps (NTP), tel que : w32tm /stripchart /computer:time.windows.com /dataonly /samples:1.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
|
PROCEDURE Get_dDateLocale(__sDateHeureLocale est une chaîne)
__sDateHeureLocale = ""
LOCAL
iTimeOut est un entier
iTimeOut = HTTPTimeOut()
HTTPTimeOut(10000)
cMaRequete est un httpRequête
cMaRequete..URL = "http://google.fr"
cMaReponse est un httpRéponse = HTTPEnvoie(cMaRequete)
SI ErreurDetectee ALORS
Erreur(ErreurInfo(errComplet))
RENVOYER Faux
FIN
HTTPTimeOut(iTimeOut)
LOCAL
sDateHeureUTC est une chaîne
dDate est une Date
hHeure est une Heure
dhDateUTC est une DateHeure
sDateHeureUTC = cMaReponse..Header["Date"]
dDate = ChaîneVersDate(Gauche(sDateHeureUTC,16),maskDateEmail)
hHeure = ChaîneVersHeure(Milieu(sDateHeureUTC,18,9),"HH:MM:SS")
dhDateUTC = dDate+""+hHeure
SI DateValide(dhDateUTC) ALORS
LOCAL
bOK est un booléen
dhDateHeureLocale est une DateHeure
sTimeZoneKeyName est une chaîne
iDynamicDaylightTimeDisabled est un entier
//On se base sur le fuseau horaire définit sur le poste en cours pour trouver l'heure locale par rapport à l'heure UTC
dhDateHeureLocale = DateHeureUTCVersLocale(dhDateUTC)
iDynamicDaylightTimeDisabled = RegistreLit("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation","DynamicDaylightTimeDisabled",bOK)
SI bOK = Faux _OU_ iDynamicDaylightTimeDisabled <> 0 ALORS
//DateHeureUTCVersLocale se charge tout seul de prendre en compte l'heure d'été si on a laissé Windows déterminer automatiquement l'heure d'été.
//Dans le cas contraire, il faut la calculer.
//Passage à l'heure d'été le dernier dimanche de mars à deux heures du matin (+60mins)
//Passage à l'heure d'hiver (normale) le dernier dimanche d'octobre à trois heures du matin (-60mins)
sTimeZoneKeyName = RegistreLit("HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\TimeZoneInformation","TimeZoneKeyName",bOK)
SI sTimeZoneKeyName = "Romance Standard Time" ALORS
LOCAL
dhDernDimancheMars est une DateHeure
dhDernDimancheOctobre est une DateHeure
dhDernDimancheMars = dhDateHeureLocale..Année+"04010200"
dhDernDimancheOctobre = dhDateHeureLocale..Année+"11010300"
dhDernDimancheMars..Jour -=1
TANTQUE DateVersJour(dhDernDimancheMars..PartieDate) <> 7
dhDernDimancheMars..Jour -=1
FIN
dhDernDimancheOctobre..Jour -=1
TANTQUE DateVersJour(dhDernDimancheOctobre..PartieDate) <> 7
dhDernDimancheOctobre..Jour -=1
FIN
SI dhDateHeureLocale >= dhDernDimancheMars _ET_ dhDateHeureLocale < dhDernDimancheOctobre ALORS
dhDateHeureLocale..Heure += 1
FIN
FIN
FIN
__sDateHeureLocale = dhDateHeureLocale
FIN
RENVOYER Vrai |
Bonne prog :ccool: