Cómo convertir la fecha de mañana (a una hora específica) en una marca de tiempo

¿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:

  • python (por ejemplo, llamadas 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
  • hay una transición de horario de verano entre ahora y la siguiente 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
  • la siguiente 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
  • la hora actual es posterior a la primera vez que ocurre una 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.