Calcule segundos desde ahora hasta el tiempo especificado hoy o mañana

Habría pensado que esta pregunta ya tendría una respuesta, pero no lo parece. En Python, quiero calcular el número de segundos desde “ahora” hasta un tiempo específico “hoy” o “mañana”, cada vez que ocurra (por ejemplo, la próxima aparición a las 6:30 AM). El plan es contar los segundos y activar una alarma musical a la hora especificada. Soy bastante nuevo en Python, y la documentación de datetime y datetime no me ha ayudado con esto hasta ahora. ¿Alguien puede ayudarme con esto?

Esto debería hacer el trabajo:

 from datetime import datetime, timedelta now = datetime.now() (timedelta(hours=24) - (now - now.replace(hour=6, minute=30, second=0, microsecond=0))).total_seconds() % (24 * 3600) 
 In [12]: dt = datetime.datetime.now() Out[13]: datetime.datetime(2016, 4, 23, 4, 8, 36, 742436) In [14]: six_thirty = datetime.datetime(2016, 4, 23, 06, 30, 0, 0) In [15]: six_thirty - dt Out[15]: datetime.timedelta(0, 8483, 257564) 

Notas

El objeto datetime está formateado en año, mes, día, hora, min, segundo, milisegundo.

El objeto timedelta da la diferencia en días, segundos, microsegundos, por lo que para este ejemplo, hay 8483 segundos hasta las 630 am, lo que se traduce en aproximadamente 2 horas y 21 minutos y 23 segundos.

Eso es bastante fuerte! Y ahora para todo, desde el tiempo de AM / PM hasta los segundos restantes (probablemente hay una forma de hacerlo en menos líneas de código, pero esto funciona):

 >>> from datetime import datetime, timedelta >>> futime = '10:30 AM' >>> fustrip = futime.rstrip(' AM') >>> fusplit = fustrip.split(':') >>> hr = int(fusplit[0]) >>> min = int(fusplit[1]) >>> now = datetime.now() >>> secsleft = int((timedelta(hours=24) - (now - now.replace(hour=hr, minute=min, second=0, microsecond=0))).total_seconds() % (24 * 3600)) >>> secsleft 2063 

Ahí es donde está el tiempo (10:30 AM) hoy. Para las 6:30 de mañana, funciona también:

 >>> hr = 6 >>> secsleft = int((timedelta(hours=24) - (now - now.replace(hour=hr, minute=min, second=0, microsecond=0))).total_seconds() % (24 * 3600)) >>> secsleft 74063