Как проверить разницу в секундах между двумя датами?

180

Должен быть более простой способ сделать это. У меня есть объекты, которые нужно обновлять время от времени, поэтому я хочу записывать, когда они были созданы, проверять текущую временную метку и обновлять при необходимости.

datetime.datetime оказался трудным, и я не хочу погружаться в библиотеку ctime. Есть ли что-нибудь проще для такого рода вещей?

Alex
источник

Ответы:

516

если вы хотите вычислить разницу между двумя известными датами, используйте total_secondsтак:

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
«Заметка» - самая важная часть, которую люди пропускают. Я хотел бы отдать еще один голос по этому вопросу.
Декстер
Есть моменты, когда я замечаю, что это дает, казалось бы ... неправильный результат. 59.800 секунд за долю секунды. Таким образом, для небольших операций, таких как разность секунд, миллисекунд или микросекунд, можно использовать, (b-a).microsecondsа затем разделить их, чтобы получить секунды (1000000) или миллисекунды (1000)
Zld Productions,
кажется, что значение всегда положительное, даже если a и b поменялись местами
Nickpick
@ Никакое значение не всегда положительно. Например, следующее -60:from datetime import datetime; (datetime(2019, 1, 1, 0, 0) - datetime(2019, 1, 1, 0, 1)).total_seconds()
JDiMatteo
Впечатляющее решение! Чистый код не требуется для создания функций.
Paulo zOiO zuLLu Fabrício
36
import time  
current = time.time()

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

будет ли это работать для вас?

matcheek
источник
1
+1; нас на самом деле не волнует дата любого вызова - мы заботимся о прошедшем времени. Так что просто используйте необработанную метку времени, как показано.
Карл Кнехтель
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 будет любым количеством времени, которое вы ждали чуть выше)

Я считаю datetime.datetime довольно полезным, поэтому, если вы столкнулись со сложным или неловким сценарием, сообщите нам об этом.

РЕДАКТИРОВАТЬ: Спасибо @WoLpH за указание, что не всегда нужно обновляться так часто, что даты и время будут близки друг к другу. Учет дней в дельте позволяет обрабатывать более длинные расхождения в отметках времени:

>>> 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
Если вы вернетесь d.seconds + d.days * 86400вместо этого, это правильно для нескольких дней;)
Вольф
7
Обратите внимание, что в общем случае это не правильно . Рассмотрим случай a - b, где aесть перед b тем (то есть, так что результат будет отрицательным): в (a - b).seconds == 86282то время a - b == datetime.timedelta(-1, 86276, 627665). Правильный метод, я считаю, заключается в использовании timedelta.total_seconds()... Но это только py2.7 +.
Дэвид Волевер
4
Действительно, ответ не правильный и должен отражать комментарий @DavidWolever. Правильный ответ: использовать timedelta.total_seconds(). Проголосовал соответственно.
astrojuanlu
3
Голосование за Python 2.6. total_seconds()это 2.7+ особенность.
Джо Холлоуэй
@JoeHolloway Я думаю, что это не работает правильно и в Python 2.6.
zen11625
12

У нас есть функция total_seconds () с Python 2.7. Пожалуйста, смотрите код ниже для Python 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)
pygaur
источник
0

Вот тот, который работает для меня.

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;

Надеюсь это поможет!

therealadrain
источник