Outils pour utilisateurs

Outils du site


temps_par_sntp

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” 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

temps_par_sntp.txt · Dernière modification: 2008/04/12 08:45 par tyrtamos

Outils de la page