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” accompagné de la commande suivante permet d'avoir la date en français:
locale.setlocale(locale.LC_TIME,'')
J'ai cependant pu remarquer que toutes les machines ne nécessitaient pas la même configuration. Certaines demandent 'fr_FR' au lieu de la chaine vide pour avoir la date en français. Et d'autres donnent une erreur avec cette valeur.
Le module “struct” permet de retrouver les infos dans le paquet UDP reçu.
#!/usr/bin/python # -*- coding: utf-8 -*- import socket import struct import time import locale locale.setlocale(locale.LC_TIME,'') 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.socket(socket.AF_INET, socket.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]).zfill(2)+'/'+str(t[1]).zfill(2)+'/'+str(t[0]).zfill(4)+\ ' '+str(t[3]).zfill(2)+':'+str(t[4]).zfill(2)+':'+str(t[5]).zfill(2) return ch else: return "échec: pas de réponse du serveur" # Exemple d'utilisation: print tempsntp() # affiche la date et l'heure comme "samedi 15/03/2008 09:03:49"
Vous pouvez tester cette fonction avec la Calculext ici: http://calculext.jpvweb.com