Convertir un timedelta en días, horas y minutos


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

Debo haber hecho esto 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é en preguntar aquí antes de sacar algunas matemáticas nauseabundantemente simples (pero detalladas).

El Sr. Fooz plantea un buen punto.

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

¿Estoy en lo cierto al decir que eso no explicaría el horario de verano? Si no, ¿cuál es la forma más sencilla de sumar/restar una hora?

Author: Oli, 2010-01-22

5 answers

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

def days_hours_minutes(td):
    return td.days, td.seconds//3600, (td.seconds//60)%60
 218
Author: Alex Martelli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-01 20:47:59

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
 61
Author: mberacochea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-05 10:49:07
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

En cuanto a DST, creo que lo mejor es convertir ambos objetos datetime a segundos. De esta manera, el sistema calcula el horario de verano por 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
 20
Author: Jason Orendorff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-01 00:03:52

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 flotador.

 4
Author: campbell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-20 17:19:05

Los Timedeltas tienen un atributo days y seconds.. puede convertirlos usted mismo con facilidad.

 1
Author: Jochen Ritzel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-22 18:24:25