2010-01-22 15 views
124

Ho un timedelta. Voglio i giorni, le ore e i minuti da quello - o come una tupla o un dizionario ... Non sono preoccupato.Convertire un timedelta in giorni, ore e minuti

Devo averlo fatto una dozzina di volte in una dozzina di lingue nel corso degli anni, ma Python di solito ha una risposta semplice a tutto, quindi ho pensato di chiedere qui prima di scartare una matematica nauseantemente semplice (eppure prolissa).

Mr Fooz solleva un buon punto.

Ho a che fare con "elenchi" (un po 'come inserzioni ebay) in cui ognuno ha una durata. Sto cercando di trovare il tempo rimasto facendo when_added + duration - now

Ho ragione nel dire che non avrebbe tenuto conto di DST? In caso contrario, qual è il modo più semplice per aggiungere/sottrarre un'ora?

risposta

176

Se si dispone di un valore di datetime.timedeltatd, td.days ti dà già i "giorni" che si desidera. timedelta valori tenere frazione del giorno come secondi (non direttamente ore o minuti) quindi dovrete davvero necessario eseguire "matematica semplici nauseanti", ad esempio:

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

timedeltas hanno un attributo days e seconds .. è possibile convertirli da soli con facilità.

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

Per quanto riguarda l'ora legale, credo che la cosa migliore è quella di convertire sia datetime oggetti secondi. In questo modo il sistema calcola l'ora legale per te.

>>> 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 
+1

'mktime()' potrebbe non riuscire se il fuso orario locale può avere un offset in tempi diversi UTC diversi (molti non) - si potrebbe usare 'modulo pytz' per ottenere l'accesso al database tz in un deteministic portatile modo. Inoltre, l'ora locale potrebbe essere ambigua (probabilità del 50% di errore) - hai bisogno di alcune informazioni aggiuntive per disambiguare ad esempio, spesso (non sempre) [le date in un file di registro sono monotone] (http://stackoverflow.com/a/26221183/4279). Vedi [Come posso sottrarre un giorno da una data python?] (Http://stackoverflow.com/q/441147/4279) che potrebbe avere a che fare con problemi simili. – jfs

4

non capisco

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

come su questo

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

Si ottiene minuti e secondi di un minuto come un galleggiante.

53

Questo è un po 'più compatto, si ottengono le ore, i minuti e i secondi in due righe.

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 
+5

non è corretto se 'td.days' è diverso da zero. Sono necessari 'ore + = td.days * 24'. Se vuoi prendere in considerazione frazioni di secondo (OP non lo fa); 'seconds + = td.microseconds/1e6' potrebbe essere usato. – jfs

Problemi correlati