Get current time in milliseconds in Python?

PythonDatetimeTime

Python Problem Overview


How can I get the current time in milliseconds in Python?

Python Solutions


Solution 1 - Python

Using time.time():

import time

def current_milli_time():
    return round(time.time() * 1000)

Then:

>>> current_milli_time()
1378761833768

Solution 2 - Python

From version 3.7 you can use time.time_ns() to get time as passed nano seconds from epoch. So you can do

ms = time.time_ns() // 1_000_000 

to get time in mili-seconds as integer.

Solution 3 - Python

time.time() may only give resolution to the second, the preferred approach for milliseconds is datetime.

from datetime import datetime
dt = datetime.now()
dt.microsecond

Solution 4 - Python

def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000)	

Solution 5 - Python

Just sample code:

import time
timestamp = int(time.time()*1000.0)

Output: 1534343781311

Solution 6 - Python

In versions of Python after 3.7, the best answer is to use time.perf_counter_ns(). As stated in the docs:

time.perf_counter() -> float > Return the value (in fractional seconds) of a performance counter, i.e. a clock with the highest available resolution to measure a short duration. It does include time elapsed during sleep and is system-wide. The reference point of the returned value is undefined, so that only the difference between the results of consecutive calls is valid.

time.perf_counter_ns() -> int > Similar to perf_counter(), but return time as nanoseconds

As it says, this is going to use the best counter your system has to offer, and it is specifically designed for using in measuring performance (and therefore tries to avoid the common pitfalls of other timers).

It also gives you a nice integer number of nanoseconds, so just divide by 1000000 to get your milliseconds:

start = time.perf_counter_ns()
# do some work
duration = time.perf_counter_ns() - start
print(f"Your duration was {duration // 1000000}ms.")

Solution 7 - Python

another solution is the function you can embed into your own utils.py

import time as time_ #make sure we don't override time
def millis():
    return int(round(time_.time() * 1000))

Solution 8 - Python

If you want a simple method in your code that returns the milliseconds with datetime:

from datetime import datetime
from datetime import timedelta

start_time = datetime.now()

# returns the elapsed milliseconds since the start of the program
def millis():
   dt = datetime.now() - start_time
   ms = (dt.days * 24 * 60 * 60 + dt.seconds) * 1000 + dt.microseconds / 1000.0
   return ms

Solution 9 - Python

If you're concerned about measuring elapsed time, you should use the monotonic clock (python 3). This clock is not affected by system clock updates like you would see if an NTP query adjusted your system time, for example.

>>> import time
>>> millis = round(time.monotonic() * 1000)

It provides a reference time in seconds that can be used to compare later to measure elapsed time.

Solution 10 - Python

If you use my code (below), the time will appear in seconds, then, after a decimal, milliseconds. I think that there is a difference between Windows and Unix - please comment if there is.

from time import time

x = time()
print(x)

my result (on Windows) was:

1576095264.2682993

EDIT: There is no difference:) Thanks tc0nn

Solution 11 - Python

The simpliest way I've found to get the current UTC time in milliseconds is:

# timeutil.py
import datetime


def get_epochtime_ms():
    return round(datetime.datetime.utcnow().timestamp() * 1000)

# sample.py
import timeutil


timeutil.get_epochtime_ms()

Solution 12 - Python

After some testing in Python 3.8+ I noticed that those options give the exact same result, at least in Windows 10.

import time

# Option 1
unix_time_ms_1 = int(time.time_ns() / 1000000)
# Option 2
unix_time_ms_2 = int(time.time() * 1000)

Feel free to use the one you like better and I do not see any need for a more complicated solution then this.

Solution 13 - Python

> UPDATED: thanks to @neuralmer.

One of the most efficient ways:

(time.time_ns() + 500000) // 1000000  #rounding last digit (1ms digit)

or

time.time_ns() // 1000000          #flooring last digit (1ms digit)

Both are very efficient among other methods.

> BENCHMARK:

You can see some benchmark results of different methods on my own machine below:

import time

t = time.perf_counter_ns()
for i in range(1000):
    o = time.time_ns() // 1000000           #each 200 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = (time.time_ns() + 500000) // 1000000  #each 227 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = round(time.time_ns() / 1000000)    #each 456 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = int(time.time_ns() / 1000000)      #each 467 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)


t = time.perf_counter_ns()
for i in range(1000):
    o = int(time.time()* 1000)          #each 319 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)

t = time.perf_counter_ns()
for i in range(1000):
    o = round(time.time()* 1000)       #each 342 ns
t2 = time.perf_counter_ns()
print((t2 - t)//1000)```

Solution 14 - Python

These multiplications to 1000 for milliseconds may be decent for solving or making some prerequisite acceptable. It could be used to fill a gap in your database which doesn't really ever use it. Although, for real situations which require precise timing it would ultimately fail. I wouldn't suggest anyone use this method for mission-critical operations which require actions, or processing at specific timings.

For example: round-trip pings being 30-80ms in the USA... You couldn't just round that up and use it efficiently.

My own example requires tasks at every second which means if I rounded up after the first tasks responded I would still incur the processing time multiplied every main loop cycle. This ended up being a total function call every 60 seconds. that's ~1440 a day.. not too accurate.

Just a thought for people looking for more accurate reasoning beyond solving a database gap which never really uses it.

Solution 15 - Python

>Time since unix

from time import time
while True:
    print(str(time()*1000)+'ms       \r', end='')

>Time since start of program

from time import time
init = time()
while True:
    print(str((time()-init)*1000)+'ms         \r', end='')

Thanks for your time

Solution 16 - Python

Just another solution using the datetime module for Python 3+.

round(datetime.datetime.timestamp(datetime.datetime.now()) * 1000)

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
QuestionNaftuli KayView Question on Stackoverflow
Solution 1 - PythonNaftuli KayView Answer on Stackoverflow
Solution 2 - PythonzardoshtView Answer on Stackoverflow
Solution 3 - PythonJason PolitesView Answer on Stackoverflow
Solution 4 - Pythonuser3324131View Answer on Stackoverflow
Solution 5 - PythonWilson WuView Answer on Stackoverflow
Solution 6 - PythonAndrew MinerView Answer on Stackoverflow
Solution 7 - PythonCadeyView Answer on Stackoverflow
Solution 8 - PythonPascalView Answer on Stackoverflow
Solution 9 - PythonPhil HordView Answer on Stackoverflow
Solution 10 - PythonhoomanView Answer on Stackoverflow
Solution 11 - PythonLaymainView Answer on Stackoverflow
Solution 12 - PythonAnders BreidView Answer on Stackoverflow
Solution 13 - PythonSeyfiView Answer on Stackoverflow
Solution 14 - PythonMike GuidryView Answer on Stackoverflow
Solution 15 - PythonLucas UrbanView Answer on Stackoverflow
Solution 16 - PythonVikasView Answer on Stackoverflow