obtener - fechas en python
Encuentre si han pasado 24 horas entre fechas-Python (2)
Solo para aclarar algunas cosas, porque no creo que todos usemos el time
lib de Python. Cuando usas datetime
, que es especialmente en Django una práctica muy común, si haces la comparación de esta manera:
if (now - then) > DAY:
fracasará enormemente. Esto se debe a que no puede comparar datetime.timedelta
con int
.
La solución a esto es convertir tus objetos a segundos.
Por ejemplo:
from datetime import datetime
then = datetime_object
now = datetime.now()
if (now - then).total_seconds() > NUMBER_OF_SECONDS:
# do something
Espero haber ayudado a quien haya tenido problemas con eso.
Aclamaciones
Tengo el siguiente método:
# last_updated is a datetime() object, representing the last time this program ran
def time_diff(last_updated):
day_period = last_updated.replace(day=last_updated.day+1, hour=1,
minute=0, second=0,
microsecond=0)
delta_time = day_period - last_updated
hours = delta_time.seconds // 3600
# make sure a period of 24hrs have passed before shuffling
if hours >= 24:
print "hello"
else:
print "do nothing"
Quiero saber si han pasado 24 horas desde last_updated
, ¿cómo puedo hacerlo en Python
?
Si last_updated
es un objeto datetime ingenuo que representa la hora en UTC:
from datetime import datetime, timedelta
if (datetime.utcnow() - last_updated) > timedelta(1):
# more than 24 hours passed
Si last_updated
es la hora local (objeto datetime ingenuo (timezone-aware)):
import time
DAY = 86400
now = time.time()
then = time.mktime(last_updated.timetuple())
if (now - then) > DAY:
# more than 24 hours passed
Si last_updated
es un tiempo ambiguo, por ejemplo, el tiempo durante una transición al final de DST (una vez al año en muchas zonas horarias), entonces hay una probabilidad cincuenta y cincuenta de que mktime()
un resultado incorrecto (por ejemplo, apagado por una hora) .
time.mktime()
también puede fallar si la biblioteca de time
C no utiliza una base de datos histórica de zona horaria en una plataforma determinada y el desplazamiento UTC para la zona horaria local fue diferente en la last_updated
hora last_updated
comparada con ahora. Puede aplicarse a más de un tercio de todas las zonas horarias en el último año. Linux, OS X, las versiones recientes de Windows tienen la base de datos tz (no sé si las versiones anteriores de Windows funcionarían para esas fechas pasadas).
Cuidado: podría ser tentador escribir datetime.now() - last_updated
(similar al caso UTC) pero se garantiza que fallará en todas las plataformas si el desplazamiento UTC fue diferente en last_updated
time (es posible en muchas zonas horarias). mktime()
solución basada en mktime()
puede utilizar la base de datos tz al menos en algunas plataformas y, por lo tanto, puede manejar los cambios en el desplazamiento UTC por cualquier razón.
Para la portabilidad, puede instalar la base de datos tz. Lo proporciona el módulo de pytz
en Python. tzlocal
puede devolver pytz
timezone correspondiente a la zona horaria local:
from datetime import datetime, timedelta
from tzlocal import get_localzone # $ pip install tzlocal
tz = get_localzone() # local timezone
then = tz.normalize(tz.localize(last_updated)) # make it timezone-aware
now = datetime.now(tz) # timezone-aware current time in the local timezone
if (now - then) > timedelta(1):
# more than 24 hours passed
Funciona incluso si el desplazamiento UTC fue diferente en el pasado. Pero no puede (así como time.mktime()
) corregir tiempos ambiguos ( tz.localize()
elige is_dst=False
time de forma predeterminada). tz.normalize()
se llama para ajustar tiempos no existentes, por ejemplo, aquellos que corresponden a una transición de inicio de DST (no debería afectar el resultado).
El código anterior asume que last_updated
es un objeto naive datetime (sin información de zona horaria asociada). Si last_updated
es un objeto datetime compatible, entonces es fácil convertirlo a UTC:
from datetime import datetime, timedelta
then_in_utc = last_updated.replace(tzinfo=None) - last_updated.utcoffset()
if (datetime.utcnow() - then_in_utc) > timedelta(1):
# more than 24 hours passed
Nota general: debe comprender ahora por qué las personas recomiendan trabajar con hora UTC y usar la hora local solo para visualizarla.