Outils pour utilisateurs

Outils du site


temps_par_sntp

Ceci est une ancienne révision du document !


Trouver la date et l'heure par consultation d'un serveur de temps ntp

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

temps_par_sntp.1203149575.txt.gz · Dernière modification: 2008/02/16 09:12 de tyrtamos

Outils de la page