Jak sprawdzić różnicę między dwiema datami w sekundach?


180

Musi być łatwiejszy sposób na zrobienie tego. Mam obiekty, które chcą być odświeżane co jakiś czas, więc chcę nagrać, kiedy zostały utworzone, sprawdzić aktualny znacznik czasu i w razie potrzeby odświeżyć.

datetime.datetime okazało się trudne i nie chcę zagłębiać się w bibliotekę ctime. Czy jest coś takiego łatwiejszego?

Odpowiedzi:


515

jeśli chcesz obliczyć różnice między dwiema znanymi datami, użyj total_secondsnastępującego:

import datetime as dt

a = dt.datetime(2013,12,30,23,59,59)
b = dt.datetime(2013,12,31,23,59,59)

(b-a).total_seconds()

86400.0

#note that seconds doesn't give you what you want:
(b-a).seconds

0


95
„Notatka” jest najważniejszą częścią, za którą tęsknią ludzie. Chciałbym móc oddać kolejny głos w tej sprawie.
Dexter,

Są chwile, w których zauważam, że daje pozornie ... nieprawidłowy wynik. 59,800 sekundy dla różnicy ułamka sekundy. Tak więc, dla mniejszych operacji, takich jak różnica sekund, milisekund lub mikrosekund, można użyć, (b-a).microsecondsa następnie podzielić to, aby uzyskać sekundy (1000000) lub milisekund (1000)
Zld Productions

wydaje się, że wartość jest zawsze dodatnia, nawet po
zamianie aib

@Nickpick wartość nie zawsze jest dodatnia. np. następujące -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo

Imponujące rozwiązanie! Czysty kod nie jest konieczny do tworzenia funkcji.
Paulo zOiO zuLLu Fabrício

35
import time  
current = time.time()

...job...
end = time.time()
diff = end - current

czy to byłoby dla Ciebie ok?


1
+1; tak naprawdę nie dbamy o datę żadnego wezwania - dbamy o upływ czasu. Więc po prostu użyj surowego znacznika czasu, jak pokazano.
Karl Knechtel,

14
>>> from datetime import datetime

>>>  a = datetime.now()

# wait a bit 
>>> b = datetime.now()

>>> d = b - a # yields a timedelta object
>>> d.seconds
7

(7 będzie czasem, w którym czekałeś nieco powyżej)

Uważam, że datetime.datetime jest dość przydatny, więc jeśli napotkasz skomplikowany lub niezręczny scenariusz, daj nam znać.

EDYCJA: Dzięki @WoLpH za zwrócenie uwagi, że nie zawsze chce się odświeżać tak często, że czasy danych będą blisko siebie. Uwzględniając dni w delcie, możesz obsługiwać dłuższe rozbieżności w znacznikach czasu:

>>> a = datetime(2010, 12, 5)
>>> b = datetime(2010, 12, 7)
>>> d = b - a
>>> d.seconds
0
>>> d.days
2
>>> d.seconds + d.days * 86400
172800

1
Jeśli d.seconds + d.days * 86400zamiast tego wrócisz , jest to ważne przez wiele dni;)
Wolph

7
Zauważ, że w ogólnym przypadku nie jest to poprawne . Rozważ przypadek a - b, w którym ajest wcześniej b (tzn. Wynik będzie negatywny): (a - b).seconds == 86282while a - b == datetime.timedelta(-1, 86276, 627665). Uważam, że poprawną metodą jest użycie timedelta.total_seconds()… Ale to tylko py2.7 +.
David Wolever,

4
Rzeczywiście odpowiedź jest nieprawidłowa i powinna odzwierciedlać komentarz @DavidWolever. Prawidłowa odpowiedź to: użyj timedelta.total_seconds(). Doceniono odpowiednio.
astrojuanlu

3
Pozytywna odpowiedź na pytanie dotyczące języka Python 2.6. total_seconds()jest funkcją 2.7+.
Joe Holloway

@JoeHolloway Wydaje mi się, że to również nie działa poprawnie w Pythonie 2.6.
zen11625

12

Mamy funkcję total_seconds () w Pythonie 2.7. Zobacz kod poniżej dla Pythona 2.6

import datetime
import time  

def diffdates(d1, d2):
    #Date format: %Y-%m-%d %H:%M:%S
    return (time.mktime(time.strptime(d2,"%Y-%m-%d %H:%M:%S")) -
               time.mktime(time.strptime(d1, "%Y-%m-%d %H:%M:%S")))

d1 = datetime.now()
d2 = datetime.now() + timedelta(days=1)
diff = diffdates(d1, d2)

0

Oto ten, który dla mnie działa.

from datetime import datetime

date_format = "%H:%M:%S"

# You could also pass datetime.time object in this part and convert it to string.
time_start = str('09:00:00') 
time_end = str('18:00:00')

# Then get the difference here.    
diff = datetime.strptime(time_end, date_format) - datetime.strptime(time_start, date_format)

# Get the time in hours i.e. 9.60, 8.5
result = diff.seconds / 3600;

Mam nadzieję że to pomoże!

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.