387 Stimmen

Umrechnung eines Zeitdeltas in Tage, Stunden und Minuten

Ich habe ein Timedelta. Ich möchte die Tage, Stunden und Minuten davon - entweder als Tupel oder als Wörterbuch... Das ist mir egal.

Ich muss dies ein Dutzend Mal in einem Dutzend Sprachen im Laufe der Jahre getan haben, aber Python hat in der Regel eine einfache Antwort auf alles, so dass ich dachte, ich würde hier fragen, bevor busting aus einigen ekelhaft einfach (aber wortreich) Mathematik.

Herr Fooz spricht ein gutes Argument an.

Ich habe es mit "Angeboten" zu tun (ähnlich wie bei ebay), bei denen jedes Angebot eine bestimmte Dauer hat. Ich versuche, die verbleibende Zeit zu ermitteln, indem ich when_added + duration - now

Liege ich richtig, wenn ich behaupte, dass dies nicht mit der Sommerzeit zusammenhängt? Wenn nicht, wie kann man am einfachsten eine Stunde addieren/subtrahieren?

529voto

Alex Martelli Punkte 805329

Wenn Sie eine datetime.timedelta Wert td , td.days gibt Ihnen bereits die gewünschten "Tage". timedelta Werte halten Tagesbruchteile als Sekunden (nicht direkt Stunden oder Minuten), so dass Sie in der Tat "ekelhaft einfache Mathematik" durchführen müssen, z. B.:

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

111voto

mberacochea Punkte 1604

Dies ist etwas kompakter, Sie erhalten die Stunden, Minuten und Sekunden in zwei Zeilen.

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

40voto

Jason Orendorff Punkte 39655
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60

Was die Sommerzeit betrifft, so halte ich es für das Beste, beides umzustellen. datetime Objekte in Sekunden. Auf diese Weise berechnet das System die Sommerzeit für Sie.

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

17voto

SiL3NC3 Punkte 568

Für alle, die mitkommen und nach einer Umsetzung suchen:

Die obigen Beiträge beziehen sich auf datetime.timedelta, das leider keine Eigenschaften für Stunden und Sekunden hat. Es wurde bisher nicht erwähnt, dass es ein Paket gibt, das diese Eigenschaften hat. Sie können es hier finden:

Beispiel - Kalkulation:

>>> import timedelta

>>> td = timedelta.Timedelta(days=2, hours=2)

# init from datetime.timedelta
>>> td = timedelta.Timedelta(datetime1 - datetime2)

Beispiel - Eigenschaften:

>>> td = timedelta.Timedelta(days=2, hours=2)
>>> td.total.seconds
180000
>>> td.total.minutes
3000
>>> td.total.hours
50
>>> td.total.days
2

Ich hoffe, dies könnte jemandem helfen...

10voto

campbell Punkte 147

Das verstehe ich nicht.

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

wie wäre es damit

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

Sie erhalten Minuten und Sekunden einer Minute als Schwimmer.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X