Wie kann ich den Zeitunterschied in Minuten zwischen zwei datetime
Objekte?
Antworten
Zu viele Anzeigen?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
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
).
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
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