Este código imprime una advertencia falsa una vez al año, en la noche del cambio de reloj (horario de verano de Europa central a horario de Europa central):
import os
import datetime
now = datetime.datetime.now()
age = now - datetime.datetime.fromtimestamp(os.path.getmtime(file_name))
if (age.seconds + age.days * 24 * 3600) < -180:
print('WARN: file has timestap from future?: %s' % age)
¿Cómo hacer que este código funcione incluso durante este turno anual de una hora?
Actualizar
Solo me importa la edad, no la fecha y hora.
ambos objetos datetime son 'ingenuos', lo que significa que no saben acerca del horario de verano.
datetime.now()
devuelve la hora actual en que se ejecuta su máquina, y eso podría incluir DST. Lo mismo vale paradatetime.fromtimestamp(os.path.getmtime())
.# 1: localizar sus objetos de fecha y hora podría ser una opción; algo como
# 2 - otra opción, usando la conversión UTC con
datetime
:# 3 - como VPfB señala en su respuesta,
os.path.getmtime
devuelve una marca de tiempo UTC (verifique los documentos del módulo os y los documentos del módulo horario ). Entonces, la solución más fácil podría ser omitir la conversióndatetime
en primer lugar y usar solo marcas de tiempo UTC; por ejemplo, obtener la marca de tiempo UTC actual comotime.time()
.Trabajar con zonas horarias puede volverte loco ... pero hay algunos buenos recursos, por ejemplo, esta publicación mediana .
fuente
Su problema es que está obteniendo su tiempo sin que sea consciente de la zona horaria. Entonces, cuando cambian los relojes, terminas de comparar una marca de tiempo anterior al cambio del reloj y otra después del cambio del reloj y tu código no ve esto.
En cambio, debe hacer que sus objetos de fecha y hora se basen en una zona horaria específica para que no tenga problemas con el cambio de relojes, le recomiendo usar el módulo pytz para ayudarlo con esto. Puede ver una lista de zonas horarias disponibles en esta respuesta: ¿Hay una lista de zonas horarias de Pytz?
Aquí hay un ejemplo de código simple de cómo puede hacer esto con objetos conscientes de la zona horaria:
fuente
age = time.time() - os.path.getmtime(file_name)
. Solo estoy interesado en la edad (hora delta) no en la fecha y hora.