Python - time difference in milliseconds not working for me

Python

Python Problem Overview


I've read a few posts about this and thought I had some code that worked. If the difference between the 2 values is less than a 1sec then the millisecs displayed is correct.

If the difference is more than a sec, its still only showing me the difference of the millisecs.

As below.

Correct:

 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

Wrong - this should be 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

Python Solutions


Solution 1 - Python

Try using total_seconds method:

print time_diff_wind.total_seconds() * 1000

That method is equivalent to: (td.microseconds + (td.seconds + td.days * 24 * 3600) * 10**6) / 10**6

> Note: It's available since version 2.7

Solution 2 - Python

>>> 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

your microseconds don't include the seconds that have passed

Solution 3 - Python

The correct answer (in 2020) is:

>>> from datetime import timedelta
>>> timedelta(days=1, milliseconds=50) / timedelta(milliseconds=1)
86400050.0

The other answers lose precision and/or are more verbose.

Solution 4 - Python

I faced this issue as well, but in my case I need real milliseconds precision, so using total_seconds() * 1000 isn't an option for me, so what I did is:

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

I hope this helps someone else! :)

Solution 5 - Python

From the documentation:

> Instance attributes (read-only): > > Attribute Value > > days Between -999999999 and 999999999 inclusive > > seconds Between 0 and 86399 inclusive > > microseconds Between 0 and > 999999 inclusive

Microseconds never exceed 999,999. Hence your milliseconds never exceed 999.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionGregView Question on Stackoverflow
Solution 1 - PythonmoliwareView Answer on Stackoverflow
Solution 2 - PythonblakevView Answer on Stackoverflow
Solution 3 - Pythonshadow-lightView Answer on Stackoverflow
Solution 4 - PythonCaumonsView Answer on Stackoverflow
Solution 5 - PythonHyperboreusView Answer on Stackoverflow