Вычислить разницу во времени даты Python

Я пишу функцию timediff для вычисления разницы во времени (в секундах) между двумя датами и временем.

def timediff(time1, time2):
    timeformat = '%d%b%Y:%H:%M:%S'
    #time1="01MAR2016:07:11:53"
    #time2="01MAR2016:16:28:38"

    try:
        date_object1 = datetime.strptime(time1, timeformat)
        date_object2 = datetime.strptime(time2, timeformat)
    except ValueError:
        print "time1 format: " + repr(time1)
        print "time2 format: " + repr(time2)
        raise                      

    return abs((date_object2 - date_object1).seconds)  

Кажется, что "месяц, число, год" не учитывается при расчете. Это дает правильный расчет, если он находится в том же «месяц, число, год»

>>> t1="01MAR2016:07:11:53"
>>> t2="01MAR2016:16:28:38"
>>> timediff(t1, t2)
33405

Однако с другим «месяцем, числом, годом» он дает неправильный ответ. Это вычисляет только разницу во времени ~ 18 часов (что дает ~ 65 тысяч секунд)

>>> t1="02APR2016:06:43:51"
>>> t2="06APR2016:00:58:03"
>>> timediff(t1, t2)
65652

Или 24 часа разные, это дает 0

>>> t1="01MAR2016:07:11:53"
>>> t2="02MAR2016:07:11:53"
>>> timediff(t1, t2)
0

Datetime принимает формат времени, который я даю

>>> t1="01MAR2016:07:11:53"
>>> t2="02MAR2016:07:11:53"
>>> datetime.strptime(t1, timeformat)
datetime.datetime(2016, 3, 1, 7, 11, 53)
>>> datetime.strptime(t2, timeformat)
datetime.datetime(2016, 3, 2, 7, 11, 53)

Я что-то упустил?

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

Моя альтернатива

def timediff(time1, time2):
    timeformat = '%d%b%Y:%H:%M:%S'
    t1 = datetime.strptime(time1, timeformat)
    t2 = datetime.strptime(time2, timeformat)

    return abs(time.mktime(t1.timetuple()) - time.mktime(t2.timetuple()))

Пример:

>>> t2
'02MAR2016:07:11:53'
>>> t1
'01MAR2016:07:11:53'
>>> timediff(t1,t2)
86400.0

person Nogcas    schedule 20.06.2016    source источник
comment
вы используете .seconds вместо .total_seconds()   -  person Tadhg McDonald-Jensen    schedule 20.06.2016
comment
Ты прав! Спасибо за уточнение. Не знал, что есть .total_seconds()   -  person Nogcas    schedule 20.06.2016


Ответы (1)


Вам нужно использовать total_seconds(), а не seconds:

>>> import datetime
>>> f = '%d%b%Y:%H:%M:%S'
>>> t1 = '01MAR2016:07:11:53'
>>> t2 = '02MAR2016:07:11:53'
>>> d1 = datetime.datetime.strptime(t1, f)
>>> d2 = datetime.datetime.strptime(t2, f)
>>> print(d2-d1)
1 day, 0:00:00
>>> print((d2-d1).total_seconds())
86400.0
>>> print((d2-d1).seconds)
0
person Burhan Khalid    schedule 20.06.2016
comment
избили меня, чтобы написать ответ, ну и добавить сюда ссылки на документацию на timedelta.seconds От 0 до 86399 включительно и ссылка на timedelta.total_seconds() - person Tadhg McDonald-Jensen; 20.06.2016