2009-10-21 8 views
10

J'ai écrit une application de bureau et j'utilisais datetime.datetime.utcnow() pour l'horodatage, mais j'ai récemment remarqué que certaines personnes utilisant l'application obtiennent des résultats très différents de ce que je fais lorsque nous exécutons le programme en même temps. Est-il possible d'obtenir l'heure UTC localement sans utiliser urllib pour la récupérer sur un site Web?Comment puis-je obtenir une heure UTC précise avec Python?

Répondre

20

Python dépend du système d'exploitation sous-jacent pour fournir une horloge précise de l'heure. Si ce n'est pas le cas, vous n'avez pas beaucoup d'autre choix que de contourner les o/s. Il existe une implémentation pure-Python d'un client NTP here. Une approche très simple d'esprit:

>>> import ntplib,datetime 
>>> x = ntplib.NTPClient() 
>>> datetime.datetime.utcfromtimestamp(x.request('europe.pool.ntp.org').tx_time) 
datetime.datetime(2009, 10, 21, 7, 1, 54, 716657) 

Cependant, il ne serait pas très agréable d'être frapper continuellement sur d'autres serveurs NTP là-bas. Un bon citoyen net utiliserait la bibliothèque cliente ntp pour garder trace du décalage entre l'horloge système du système d'exploitation et celle obtenue du serveur et n'interrogerait que périodiquement pour ajuster l'heure.

+0

Et avec monkeypatching, vous pouvez enregistrer ce décalage et modifier la méthode de la bibliothèque datetime pour appliquer le décalage chaque fois qu'une partie de l'application demande l'heure. Ce serait bien que la bibliothèque time et datetime gère automatiquement ce type de décalage. Vous pouvez lui dire que vous voulez du temps réel, il va frapper un serveur NTP, enregistrer le décalage, et l'appliquer chaque fois que ce temps est utilisé. –

+2

Cela ne tient pas compte du "temps d'aller-retour" de la demande. Ce que vous voulez faire est d'utiliser 'time.clock()' pour mesurer combien de temps 'NTPClient()' a pris pour répondre, divisez-le en deux et ajoutez-le à l'heure donnée. C'est exact. –

7

En fait, ntplib calcule cette comptabilisation de décalage pour le temps de propagation aller-retour. Il est disponible via l'attribut "offset" de la réponse NTP. Par conséquent, le résultat ne devrait pas très follement.

+1

C'est un commentaire utile mais ce n'est pas une réponse. Vous devriez le déplacer dans les commentaires ci-dessus. – jfs

+0

Je pense que cela fournit une sorte de réponse dans la façon dont l'observation de l'OP (résultats très différents) peut être fausse. Et comment quelqu'un veut-il avoir du temps UTC localement sans avoir une horloge atomique? – Trilarion

+0

@Trilarion: Je ne vois rien d'inhabituel à ce que des ordinateurs différents reviennent à un autre moment. Même [si l'heure est synchronisée en utilisant ntp; il peut différer de quelques dizaines de millisecondes sur Internet] (http://stackoverflow.com/a/97939/4279). Vous n'avez pas besoin d'une horloge atomique locale pour obtenir l'heure UTC (qui n'est pas connue en temps réel si vous voulez des dizaines de nanosecondes de précision) avec une précision de microsecondes, vous pouvez utiliser le GPS (par exemple via le même logiciel ntp). Pour l'échelle: [les effets relativistes sont des microsecondes par jour ici] (http://www.astronomy.ohio-state.edu/~pogge/Ast162/Unit5/gps.html) – jfs

Questions connexes