2009-10-21 22 views
10

Escribí una aplicación de escritorio y estaba usando datetime.datetime.utcnow() para marcar el tiempo, sin embargo, recientemente he notado que algunas personas que usan la aplicación obtienen resultados muy diferentes a los que tengo cuando ejecutamos el programa al mismo tiempo. ¿Hay alguna forma de obtener la hora UTC localmente sin usar urllib para buscarla desde un sitio web?¿Cómo puedo obtener una hora UTC precisa con Python?

Respuesta

20

Python depende del sistema operativo subyacente para proporcionar un reloj preciso de hora del día. Si no está haciendo eso, no tiene otra opción que no sea omitir el o/s. Hay una implementación pura de Python de un cliente NTP here. Un enfoque muy simplista:

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

Sin embargo, no sería muy agradable estar golpeando continuamente en otros servidores NTP por ahí. Un buen ciudadano de la red utilizaría la biblioteca del cliente de ntp para realizar un seguimiento de la compensación entre el reloj del sistema de o/sy la obtenida del servidor y solo sondear periódicamente para ajustar la hora.

+0

Y con monkeypatching, puede registrar ese desplazamiento y cambiar el método de la biblioteca de fecha y hora para aplicar el desplazamiento siempre que alguna parte de la aplicación solicite la hora. Sería bueno si la biblioteca de hora y fecha y hora manejara este tipo de compensación automáticamente. Podría decir que quiere tiempo real, golpearía un servidor NTP, registraría el desplazamiento y lo aplicaría cada vez que se utilizara ese tiempo. –

+2

Esto no tiene en cuenta el "tiempo de ida y vuelta" de realizar la solicitud. Lo que quiere hacer es usar 'time.clock()' para medir cuánto tiempo ''Eclient()' tomó para responder, dividirlo por la mitad y agregarlo a la hora dada. Eso es exacto –

7

En realidad, ntplib calcula esta contabilidad de compensación para el retraso de ida y vuelta. Está disponible a través del atributo "desplazamiento" de la respuesta NTP. Por lo tanto, el resultado no debería ser muy salvaje.

+1

Es un comentario útil, pero no es una respuesta. Deberías moverlo a los comentarios de arriba. – jfs

+0

Creo que proporciona una especie de respuesta en la forma en que la observación de OP (resultados muy diferentes) puede ser incorrecta. ¿Y cómo alguien quiere obtener hora UTC localmente sin tener un reloj atómico? – Trilarion

+0

@Trilarion: No veo nada inusual que diferentes computadoras devuelvan tiempo diferente. Incluso [si la hora está sincronizada usando ntp; puede diferir en decenas de milisegundos en Internet] (http://stackoverflow.com/a/97939/4279). No necesita un reloj atómico local, para obtener la hora UTC (que no se conoce en tiempo real de todos modos si desea decenas de nanosegundos de precisión) con precisión de milisegundos, puede usar el GPS (por ejemplo, a través del mismo software ntp) Para la escala: [los efectos relativistas son microsegundos por día aquí] (http://www.astronomy.ohio-state.edu/~pogge/Ast162/Unit5/gps.html) – jfs

Cuestiones relacionadas