2010-12-06 3 views
102

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

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

ответ

298

, если вы хотите, чтобы вычислить разницу между двумя известными датами, используйте 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 
24
import time 
current = time.time() 

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

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

+1

+1; мы не заботимся о дате вызова - мы заботимся об истекшем времени. Так что просто используйте необработанную метку времени, как показано. – 2010-12-06 01:58:12

12
>>> 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 быть достаточно полезным, так что если есть сложный или неуклюжий сценарий, который вы столкнулись, пожалуйста, дайте нам знать.

EDIT: Благодаря @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` вместо этого, это правильно в течение нескольких дней;) – Wolph 2010-12-06 01:40:37

+5

Обратите внимание, что в общем случае это * неверно *. Рассмотрим случай `a - b`, где` a` есть * до * `b` (т. Е. Результат будет отрицательным):` (a - b) .seconds == 86282` while `a - b == datetime.timedelta (-1, 86276, 627665) `. Правильный метод, я считаю, заключается в использовании timedelta.total_seconds() `... Но это только py2.7 +. – 2011-08-10 16:19:08

8

У нас есть функция total_sec кунд() с Python 2.7 Пожалуйста, смотрите ниже код для питона 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) 
-2
>>> import datetime 

>>> d1 = datetime.datetime.now() 

>>> d2 = datetime.datetime.now() 

>>> d=d2 - d1 

>>> d.seconds 
Смежные вопросы