Ceci est une ancienne révision du document !
Avec un accès internet, on peut facilement se constituer l'analogue de l'horloge parlante, c'est à dire avoir l'heure exacte à la seconde près. J'ai pu vérifier à de nombreuses reprises que l'heure renvoyée était identique à celle donnée par une horloge dont l'heure est mise à jour par radio.
Les serveurs de temps ntp français sont ici: http://www.cru.fr/services/ntp/serveurs_francais
J'ai choisi le serveur ntp “ntp.univ-lyon1.fr” par défaut.
Exemple de réponse de la fonction: 'samedi 10/11/2007 9:12:51'
Vous pourriez avoir aussi le numéro du jour dans l'année avec “str(t[7]))”
Vous noterez que le protocole réseau utilisé est UDP et non TCP. Ce n'est donc pas du web, et on ne peut donc pas avoir l'info avec un simple navigateur!
Il a fallu calculer le nombre de secondes (=2208988800) qui sépare le 1/1/1970 (=référence Python), du 1/1/1900 (=référence service ntp).
L'importation du module “locale” permet d'avoir la date en français.
Le module “struc” permet de retrouver les infos dans le paquet UDP reçu.
#!/usr/bin/python # -*- coding: utf-8 -*- import locale import time from socket import * import struct def tempsntp(sntp='ntp.univ-lyon1.fr'): """tempsntp(sntp='ntp.univ-lyon1.fr'): Donne la date et l'heure exacte par consultation d'un serveur ntp""" jsem=["lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi", "dimanche"] temps19701900 = 2208988800L buffer=1024 # initialisation d'une connexion UDP client=socket(AF_INET, SOCK_DGRAM) # envoie de la requête UDP data='\x1b' + 47 * '\0' client.sendto(data, (sntp, 123)) # réception de la réponse UDP data, addresse = client.recvfrom(buffer) if data: tps = struct.unpack('!12I', data)[10] tps -= temps19701900 t=time.localtime(tps) ch=jsem[t[6]]+' '+str(t[2])+'/'+str(t[1])+'/'+str(t[0])+' '+str(t[3])+':'+str(t[4])+':'+str(t[5]) return ch else: return "échec: pas de réponse du serveur" print tempsntp()
Vous pouvez tester cette fonction avec la Calculext ici: http://calculext.jpvweb.com