Подтвердить что ты не робот

Python - разница во времени в миллисекундах не работает для меня

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

Если разница больше секунды, то она все еще показывает мне разницу в миллисекундах.

Как показано ниже.

Правильно:

 now_wind 2013-08-25 08:43:04.776209 
 first_time_wind 2013-08-25 08:43:04.506301
 time_diff 0:00:00.269908
 diff 269

Неправильно - это должно быть 2000 + 76?:

 now_wind 2013-08-25 08:43:25.660427
 first_time_wind 2013-08-25 08:43:23.583902
 time_diff 0:00:02.076525
 diff 76


 #!/usr/bin/env python
 import datetime
 import time
 from time import sleep
 first_time_wind = datetime.datetime.now()
 sleep (2)
 now_wind = datetime.datetime.now()
 print "now_wind", now_wind
 print "first_time_wind", first_time_wind
 time_diff_wind = (now_wind - first_time_wind)
 print "time_diff", time_diff_wind
 print "diff", time_diff_wind.microseconds / 1000
4b9b3361

Ответ 1

>>> a = datetime.datetime.now()
>>> b = datetime.datetime.now()
>>> a
datetime.datetime(2013, 8, 25, 2, 5, 1, 879000)
>>> b
datetime.datetime(2013, 8, 25, 2, 5, 8, 984000)
>>> a - b
datetime.timedelta(-1, 86392, 895000)
>>> b - a
datetime.timedelta(0, 7, 105000)
>>> (b - a).microseconds
105000
>>> (b - a).seconds
7
>>> (b - a).microseconds / 1000
105

ваши микросекунды не включают секунды, прошедшие

Ответ 2

Попробуйте использовать метод total_seconds:

print time_diff_wind.total_seconds() * 1000

Этот метод эквивалентен: (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

Примечание: доступно с версии 2.7

Ответ 3

Из документации:

Атрибуты экземпляра (только для чтения):

Значение атрибута

дней Между -999999999 и 999999999 включительно

секунды Между 0 и 86399 включительно

микросекунды Между 0 и 999999 включительно

Микросекунды никогда не превышают 999,999. Следовательно, ваши миллисекунды никогда не превышают 999.

Ответ 4

Я тоже столкнулся с этой проблемой, но в моем случае мне нужна настоящая миллисекундная точность, поэтому использование total_seconds() * 1000 для меня не вариант, так что я сделал это:

def millis_interval(start, end):
    """start and end are datetime instances"""
    diff = end - start
    millis = diff.days * 24 * 60 * 60 * 1000
    millis += diff.seconds * 1000
    millis += diff.microseconds / 1000
    return millis

Надеюсь, это поможет кому-то еще!:)