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?
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
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
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
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.
timedeltas ont un attribut days
et seconds
. vous pouvez les convertir vous-même facilement.