¿Cómo puedo crear una marca de tiempo para las próximas 6 en punto, ya sea hoy o mañana?
Probé algo con datetime.datetime.today () y reemplacé el día con +1 y hour = 6 pero no pude convertirlo en una marca de tiempo.
Necesitamos su ayuda
Para generar una marca de tiempo para mañana a las 6 AM, puede usar algo como lo siguiente. Esto crea un objeto de fecha y hora que representa la hora actual, verifica si la hora actual es <6 en punto o no, crea un objeto de fecha y hora para las siguientes 6 en punto (incluida la adición incrementando el día si es necesario), y finalmente se convierte el objeto datetime en una marca de tiempo
from datetime import datetime, timedelta import time # Get today's datetime dtnow = datetime.now() # Create datetime variable for 6 AM dt6 = None # If today's hour is < 6 AM if dtnow.hour < 6: # Create date object for today's year, month, day at 6 AM dt6 = datetime(dtnow.year, dtnow.month, dtnow.day, 6, 0, 0, 0) # If today is past 6 AM, increment date by 1 day else: # Get 1 day duration to add day = timedelta(days=1) # Generate tomorrow's datetime tomorrow = dtnow + day # Create new datetime object using tomorrow's year, month, day at 6 AM dt6 = datetime(tomorrow.year, tomorrow.month, tomorrow.day, 6, 0, 0, 0) # Create timestamp from datetime object timestamp = time.mktime(dt6.timetuple()) print(timestamp)
Para obtener los próximos 6 en punto mientras maneja las zonas horarias que observan correctamente el horario de verano:
from datetime import datetime, time, timedelta import pytz # $ pip install pytz from tzlocal import get_localzone # $ pip install tzlocal DAY = timedelta(1) local_timezone = get_localzone() now = datetime.now(local_timezone) naive_dt6 = datetime.combine(now, time(6)) while True: try: dt6 = local_timezone.localize(naive_dt6, is_dst=None) except pytz.NonExistentTimeError: # no such time today pass except pytz.AmbiguousTimeError: # DST transition (or similar) dst = local_timezone.localize(naive_dt6, is_dst=True) std = local_timezone.localize(naive_dt6, is_dst=False) if now < min(dst, std): dt6 = min(dst, std) break elif now < max(dst, std): dt6 = max(dst, std) break else: if now < dt6: break naive_dt6 += DAY
Una vez que tenga un objeto datetime consciente que represente los próximos 6 en punto en la zona horaria local, es fácil obtener la marca de tiempo:
timestamp = dt6.timestamp() # in Python 3.3+
O en versiones anteriores de Python:
timestamp = (dt6 - datetime(1970, 1, 1, tzinfo=pytz.utc)).total_seconds()
Consulte Conversión de datetime.date en la marca de hora UTC en Python .
La solución funciona incluso si ocurre algo de lo siguiente:
time.mktime()
) no tiene acceso a una base de datos histórica de zona horaria en un sistema determinado (en particular: Windows): pytz
proporciona un acceso portátil a la base de datos tz X
hora (donde X
es las 6 am en su caso) o si el desplazamiento UTC para la zona horaria local ha cambiado por cualquier otro motivo: la solución de "fecha y hora no nativa + relativedelta" fallaría silenciosamente para encontrar el número correcto de segundos, pero los objetos de fecha y hora que tienen en cuenta la zona horaria podrían permitir encontrar la diferencia horaria correcta X
hora nominal (hoy o mañana) no existe o es ambigua en la zona horaria local (la mayoría de las veces ocurre durante las transiciones DST, todos los años en muchas zonas horarias). Las soluciones que usan dateutil
tzinfos o pytz
basadas en pytz
que usan .localize()
sin is_dst=None
fallarían de forma silenciosa . La aplicación debe manejar las excepciones NonExistentTimeError
y AmbiguousTimeError
explícitamente en este caso X
hora ambigua en la zona horaria local, pero antes de la segunda vez que ocurre la hora X
- " rrule
+ return min(localize(ndt, is_dst=True), localize(ndt, is_dst=False))
"la solución fallaría silenciosamente . El código min
/ max
en la cláusula AmbiguousTimeError
arriba lo maneja correctamente.