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 : Sélectionner tout - Visualiser dans une fenêtre à part
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