575 Stimmen

Wie finde ich die Zeitdifferenz zwischen zwei datetime-Objekten in Python?

Wie kann ich den Zeitunterschied in Minuten zwischen zwei datetime Objekte?

4voto

Softmixt Punkte 1548

Ich benutze so etwas wie das hier:

from datetime import datetime

def check_time_difference(t1: datetime, t2: datetime):
    t1_date = datetime(
        t1.year,
        t1.month,
        t1.day,
        t1.hour,
        t1.minute,
        t1.second)

    t2_date = datetime(
        t2.year,
        t2.month,
        t2.day,
        t2.hour,
        t2.minute,
        t2.second)

    t_elapsed = t1_date - t2_date

    return t_elapsed

# usage 
f = "%Y-%m-%d %H:%M:%S+01:00"
t1 = datetime.strptime("2018-03-07 22:56:57+01:00", f)
t2 = datetime.strptime("2018-03-07 22:48:05+01:00", f)
elapsed_time = check_time_difference(t1, t2)

print(elapsed_time)
#return : 0:08:52

3voto

Bersan Punkte 609

Dies ergibt die Differenz in Sekunden (dann einfach durch 60 dividieren, um die Minuten zu erhalten):

import time
import datetime

t_start = datetime.datetime.now()

time.sleep(10)

t_end = datetime.datetime.now()
elapsedTime = (t_end - t_start )

print(elapsedTime.total_seconds())

Ausgänge:

10.009222

Das ist meiner Meinung nach die einfachste Methode, und Sie müssen sich keine Gedanken über Genauigkeit oder Überlauf machen.

Zum Beispiel mit elapsedTime.seconds verlieren Sie eine Menge an Präzision (es wird eine ganze Zahl zurückgegeben). Auch, elapsedTime.microseconds ist auf 10^6 begrenzt, da diese Antwort hervorgehoben. So kann zum Beispiel bei einer 10-Sekunden sleep() , elapsedTime.microseconds da 8325 (das ist falsch sollte etwa 10,000,000 ).

2voto

nidheesh Punkte 31

Die Differenz zwischen der aktuellen Zeit und 9.30 Uhr zu ermitteln

t=datetime.now()-datetime.now().replace(hour=9,minute=30)

2voto

Voy Punkte 3906

Basierend auf @Attaque großartig Antwort schlage ich eine kürzere, vereinfachte Version des Datumsdifferenz-Rechners vor:

seconds_mapping = {
    'y': 31536000,
    'm': 2628002.88, # this is approximate, 365 / 12; use with caution
    'w': 604800,
    'd': 86400,
    'h': 3600,
    'min': 60,
    's': 1,
    'mil': 0.001,
}

def get_duration(d1, d2, interval, with_reminder=False):
    if with_reminder:
        return divmod((d2 - d1).total_seconds(), seconds_mapping[interval])
    else:
        return (d2 - d1).total_seconds() / seconds_mapping[interval]

Ich habe es geändert, um die Deklaration von sich wiederholenden Funktionen zu vermeiden, das hübsche Standardintervall entfernt und Unterstützung für Millisekunden, Wochen und ISO-Monate hinzugefügt (bedenken Sie, dass Monate nur annähernd sind, basierend auf der Annahme, dass jeder Monat gleich groß ist wie 365/12 ).

Das ergibt:

d1 = datetime(2011, 3, 1, 1, 1, 1, 1000)
d2 = datetime(2011, 4, 1, 1, 1, 1, 2500)

print(get_duration(d1, d2, 'y', True))      # => (0.0, 2678400.0015)
print(get_duration(d1, d2, 'm', True))      # => (1.0, 50397.12149999989)
print(get_duration(d1, d2, 'w', True))      # => (4.0, 259200.00149999978)
print(get_duration(d1, d2, 'd', True))      # => (31.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'h', True))      # => (744.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'min', True))    # => (44640.0, 0.0014999997802078724)
print(get_duration(d1, d2, 's', True))      # => (2678400.0, 0.0014999997802078724)
print(get_duration(d1, d2, 'mil', True))    # => (2678400001.0, 0.0004999997244524721)

print(get_duration(d1, d2, 'y', False))     # => 0.08493150689687975
print(get_duration(d1, d2, 'm', False))     # => 1.019176965856293
print(get_duration(d1, d2, 'w', False))     # => 4.428571431051587
print(get_duration(d1, d2, 'd', False))     # => 31.00000001736111
print(get_duration(d1, d2, 'h', False))     # => 744.0000004166666
print(get_duration(d1, d2, 'min', False))   # => 44640.000024999994
print(get_duration(d1, d2, 's', False))     # => 2678400.0015
print(get_duration(d1, d2, 'mil', False))   # => 2678400001.4999995

1voto

Mark Kortink Punkte 1332

Hier ist eine Antwort, die sich leicht verallgemeinern oder in eine Funktion umwandeln lässt und die angemessen kompakt und leicht nachvollziehbar ist.

ts_start=datetime(2020, 12, 1, 3, 9, 45)
ts_end=datetime.now()
ts_diff=ts_end-ts_start
secs=ts_diff.total_seconds()
days,secs=divmod(secs,secs_per_day:=60*60*24)
hrs,secs=divmod(secs,secs_per_hr:=60*60)
mins,secs=divmod(secs,secs_per_min:=60)
secs=round(secs, 2)
answer='Duration={} days, {} hrs, {} mins and {} secs'.format(int(days),int(hrs),int(mins),secs)
print(answer)

Sie gibt eine Antwort in der Form Duration=270 days, 10 hrs, 32 mins and 42.13 secs

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