Як перевірити різницю між двома датами в секундах?


181

Має бути простіший спосіб зробити це. У мене є об'єкти, які хочуть оновлюватись так часто, тому я хочу записувати, коли вони були створені, перевіряти поточну мітку часу та по мірі необхідності оновити.

datetime.datetime виявилося важким, і я не хочу занурюватися в бібліотеку ctime. Чи є щось подібне легше?

Відповіді:


517

якщо ви хочете обчислити різниці між двома відомими датами, скористайтеся 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

видається, що значення завжди позитивне, навіть коли
підміняються

@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

це працювало б для вас?


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

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замість цього, це правильно протягом декількох днів;)
Вольф

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)

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;

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.