437 Stimmen

Zeitdelta in String formatieren

Ich habe Probleme bei der Formatierung einer datetime.timedelta Objekt.

Hier ist, was ich t Ich habe eine Liste von Objekten und eines der Mitglieder der Klasse des Objekts ist ein Timedelta-Objekt, das die Dauer eines Ereignisses anzeigt. Ich möchte diese Dauer im Format Stunden:Minuten anzeigen.

Ich habe verschiedene Methoden ausprobiert, um dies zu erreichen, aber ich habe Schwierigkeiten. Mein derzeitiger Ansatz besteht darin, der Klasse für meine Objekte Methoden hinzuzufügen, die Stunden und Minuten zurückgeben. Die Stunden erhalte ich, indem ich die timedelta.seconds durch 3600 teile und das Ergebnis runde. Ich habe Schwierigkeiten, die restlichen Sekunden zu ermitteln und in Minuten umzurechnen.

Übrigens, ich verwende Google AppEngine mit Django Templates für die Präsentation.

300voto

Parand Punkte 96946

Sie können das Zeitdelta einfach mit str() in eine Zeichenkette umwandeln. Hier ist ein Beispiel:

import datetime
start = datetime.datetime(2009,2,10,14,00)
end   = datetime.datetime(2009,2,10,16,00)
delta = end-start
print(str(delta))
# prints 2:00:00

265voto

John Fouhy Punkte 39035

Wie Sie wissen, können Sie die total_seconds von einem timedelta-Objekt erhalten, indem Sie auf die .seconds Attribut.

Python bietet die eingebaute Funktion divmod() die dies ermöglicht:

s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40

oder Sie können in Stunden und Rest umrechnen, indem Sie eine Kombination aus Modulo und Subtraktion verwenden:

# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600 
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40

84voto

joeforker Punkte 38123
>>> str(datetime.timedelta(hours=10.56))
10:33:36

>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30

Die Übergabe der timedelta Objekt zum str() ruft denselben Formatierungscode auf, der verwendet wird, wenn wir einfach print td . Da Sie die Sekunden nicht wollen, können wir die Zeichenkette durch Doppelpunkte trennen (3 Teile) und sie nur mit den ersten beiden Teilen wieder zusammensetzen.

64voto

Adam Jacob Muller Punkte 733
def td_format(td_object):
    seconds = int(td_object.total_seconds())
    periods = [
        ('year',        60*60*24*365),
        ('month',       60*60*24*30),
        ('day',         60*60*24),
        ('hour',        60*60),
        ('minute',      60),
        ('second',      1)
    ]

    strings=[]
    for period_name, period_seconds in periods:
        if seconds > period_seconds:
            period_value , seconds = divmod(seconds, period_seconds)
            has_s = 's' if period_value > 1 else ''
            strings.append("%s %s%s" % (period_value, period_name, has_s))

    return ", ".join(strings)

63voto

anarcat Punkte 4847

Ich persönlich benutze die humanize Bibliothek für diesen Zweck:

>>> import datetime
>>> humanize.naturalday(datetime.datetime.now())
'today'
>>> humanize.naturalday(datetime.datetime.now() - datetime.timedelta(days=1))
'yesterday'
>>> humanize.naturalday(datetime.date(2007, 6, 5))
'Jun 05'
>>> humanize.naturaldate(datetime.date(2007, 6, 5))
'Jun 05 2007'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=1))
'a second ago'
>>> humanize.naturaltime(datetime.datetime.now() - datetime.timedelta(seconds=3600))
'an hour ago'

Natürlich erhalten Sie dadurch keine genau die Antwort, nach der Sie gesucht haben (die in der Tat lautet, str(timeA - timeB) Aber ich habe festgestellt, dass das Display nach ein paar Stunden schnell unlesbar wird. humanize unterstützt viel größere Werte, die für Menschen lesbar sind, und ist außerdem gut lokalisiert.

Es ist inspiriert von Djangos contrib.humanize Modul, anscheinend, so dass, da Sie Django verwenden, sollten Sie wahrscheinlich, dass zu verwenden.

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