web-dev-qa-db-fra.com

Convertir un timedelta en jours, heures et minutes

J'ai un timedelta. Je veux les jours, les heures et les minutes qui suivent, que ce soit sous forme de tuple ou de dictionnaire ... Je ne suis pas dérangé.

J'ai dû faire cela une douzaine de fois dans une douzaine de langues au fil des ans, mais Python a généralement une réponse simple à tout, alors j'ai pensé poser la question ici avant d'écraser des mathématiques nauséabondes (pourtant verbeuses).

M. Fooz soulève un bon point.

J'ai affaire à des "listings" (un peu comme les listings d'ebay) où chacun a une durée. J'essaie de trouver le temps qui reste en faisant when_added + duration - now

Ai-je raison de dire que cela ne tiendrait pas compte de l'heure d'été? Si non, quel est le moyen le plus simple d'ajouter/soustraire une heure?

199
Oli

Si vous avez un datetime.timedelta valeur td, td.days vous donne déjà les "jours" souhaités. Les valeurs timedelta conservent la fraction de journée en secondes (et non directement en heures ou en minutes).

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

C'est un peu plus compact, vous obtenez les heures, les minutes et les secondes sur deux lignes.

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
66
mberacochea
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

En ce qui concerne DST, je pense que la meilleure chose à faire est de convertir les deux objets datetime en secondes. De cette façon, le système calcule l'heure d'été pour vous.

>>> 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
24
Jason Orendorff

Je ne comprends pas

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

que dis-tu de ça

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

Vous obtenez des minutes et des secondes d'une minute en float.

6
campbell

timedeltas ont un attribut days et seconds. vous pouvez les convertir vous-même facilement.

4
Jochen Ritzel