semana obtener fechas python datetime timezone

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.