Convertir un timedelta a días, horas y minutos.

Tengo una timedelta. Quiero los días, las horas y los minutos de eso, ya sea como una tupla o un diccionario … No estoy preocupado.

Debo haberlo hecho una docena de veces en una docena de idiomas a lo largo de los años, pero Python generalmente tiene una respuesta simple a todo, así que pensé que lo pediría aquí antes de analizar algunas matemáticas nauseabundamente simples (pero verbosas).

El señor Fooz plantea un buen punto.

Estoy tratando con “listados” (un poco como listados de ebay) donde cada uno tiene una duración. Estoy tratando de encontrar el tiempo que queda haciendo when_added + duration - now

¿Estoy en lo cierto al decir que no daría cuenta de DST? Si no es así, ¿cuál es la forma más sencilla de agregar / restar una hora?

Si tiene un valor de datetime.timedelta td , td.days ya le da los “días” que desea. timedelta valores de timedelta mantienen la fracción del día como segundos (no directamente horas o minutos), por lo que, de hecho, tendrá que realizar “matemáticas nauseabundamente simples”, por ejemplo:

 def days_hours_minutes(td): return td.days, td.seconds//3600, (td.seconds//60)%60 

Esto es un poco más compacto, obtienes las horas, minutos y segundos en dos líneas.

 days = td.days hours, remainder = divmod(td.seconds, 3600) minutes, seconds = divmod(remainder, 60) # If you want to take into account fractions of a second seconds += td.microseconds / 1e6 
 days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

En cuanto a DST, creo que lo mejor es convertir ambos objetos de datetime y datetime en segundos. De esta manera el sistema calcula DST para usted.

 >>> m13 = datetime(2010, 3, 13, 8, 0, 0) # 2010 March 13 8:00 AM >>> m14 = datetime(2010, 3, 14, 8, 0, 0) # DST starts on this day, in my time zone >>> mktime(m14.timetuple()) - mktime(m13.timetuple()) # difference in seconds 82800.0 >>> _/3600 # convert to hours 23.0 

No entiendo

 days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

Qué tal esto

 days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600 / 60.0 

Obtienes minutos y segundos de un minuto como un flotador.

Timedeltas tiene un atributo de days y seconds . Puede convertirlos usted mismo con facilidad.