834

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

4
  • 89
    import time; ms = time.time()*1000.0 Commented May 13, 2011 at 22:07
  • 7
    @samplebias: time.time() may provide worse precision than datetime.utcnow() on some platforms and python versions. Commented Mar 24, 2015 at 20:20
  • 7
    In milliseconds since when? If you mean since the epoch (midnight 1 January 1970 UTC), see this: stackoverflow.com/questions/18169099/… Commented Dec 2, 2015 at 23:20
  • 2
    For true microsecond-resolution milliseconds time stamps see here: stackoverflow.com/questions/38319606/… Commented Jul 12, 2016 at 4:40

19 Answers 19

1032

Using time.time():

import time

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

Then:

>>> current_milli_time()
1378761833768
Sign up to request clarification or add additional context in comments.

16 Comments

This may not give the correct answer. According to the docs, "Note that even though the time is always returned as a floating point number, not all systems provide time with a better precision than 1 second"
I am wondering, why do you need to round? It seems int(time.time() * 1000) is enough?
IMO I'd use floor and not round, but that's just me. If someone asks what the hour is, and it's 7:32, the number they probably want is 7, not 8.
@MaximVladimirsky That isn't the behavior of int(). Int does not floor a value, it rounds toward zero. Which is the same thing for positive number, but the opposite for negative. int(1.5) gives 1, int(-1.5) gives -1, math.floor(-1.5) gives -2 See: docs.python.org/2/library/stdtypes.html
@SkipHuffman Since you will never get a negative number for the current time, you can just use int(time.time() * 1000).
|
200

For Python 3.7+, time.time_ns() gives the time passed in nanoseconds since the epoch.

This gives time in milliseconds as an integer:

import time

ms = time.time_ns() // 1_000_000

2 Comments

Why floor division (//) though ?
@big_in_japan floor is all you can do, otherwise you risk being in the future
96

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

16 Comments

not quite useful - this only gives you the microseconds within the dt's second. see stackoverflow.com/a/1905423/74632
-1. this is an incorrect answer to this question. as @Boris commented, this does not give "the time in microseconds", e.g. does not include days, hours, seconds in number of microseconds.
+1 This gives a correct value and arithmetic can be assumed to work because math. If the user needs the current time in milliseconds/microseconds, simple arithmetic will get them there. If a time delta is needed--which is not asked for--arithmetic, again, saves the day.
@j-a: it does include "days, hours, seconds" (it fixes the issue pointed out in your comment). To address the new issue (leap seconds): POSIX time does NOT count leap seconds and time.time() returns POSIX time on most systems supported by Python (if we exclude uncommon "right" timezones). Don't confuse precision and accuracy -- this question is about the millisecond precision -- if you need the millisecond accuracy then you need to talk about clock synchronization, ntp (LAN vs. WAN), etc first.
Gives microsecond of the current time, not entire timestamp.
|
59
def TimestampMillisec64():
    return int((datetime.datetime.utcnow() - datetime.datetime(1970, 1, 1)).total_seconds() * 1000) 

3 Comments

you could inline the formula for .total_seconds() to produce (possibly) better precision: (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**3 (with true division enabled) Or if you want to truncate the milliseconds then use // 10**3.
This seems to be the best answer if using datetime
If you are presenting this as a cross platform python solution, is there an assurance that all platforms and all python versions 3+ will properly account for any past leap seconds in what is returned by datetime.datetime.utcnow(), or are there lurking difficulties with this as a consistent cross platform solution?
34

Just sample code:

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

Output: 1534343781311

1 Comment

time.time() does not gaurantee that OS supports fraction of a second
29

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.")

2 Comments

So not possible to get the current epoch with that precision?
I don't believe so. Using time.time_ns() is your best bet, but it has different guarantees.
15

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

4 Comments

this is the difference between two times in milliseconds, combining your method with @Jason s answer gives the current timestamp in milliseconds... Thinking about it, the UNIX timestamp would be your method with start_time = datetime(1970,1,1)
local time may be ambiguous and non-monotonous (due to DST transitions or other reasons to change the local utc offset). Use .utcnow() instead or if you don't need the absolute time then you could use time.monotonous(). Note: there is a subtle difference due to floating-point arithmetics between some_int + dt.microseconds/ 1000.0 and the formula ( ) / 10**3 with true division enabled. See the explicit formula and the link for total_seconds() in the related answer
@jfs .utcnow() is deprecated in 3.12
@Et7f3XIV on modem Python, the answer for absolute case is based on time.time_ns() and time.perf_counter_ns() for small relative case correspondingly
14

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

Comments

14

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.

Comments

13

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

1 Comment

[@Cadey][1] this solution is dangerous, it will give you back results which have different sizes eg. 13 characters normally but sometimes it turns the result to a timestamp which follows seconds and not milis, if you use the dates to compare you will run into issues (experiences this on our production system, replicated this using a python script)
12

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

2 Comments

No diff on Mac OSX:/usr/local/opt/python/bin/python3.7 scratch.py 1577212639.882543
No diff on Ubuntu 18:python3 scratch.py 1577212763.9136133
10

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

2 Comments

OP is looking for milliseconds, by dividing by only 1000, you're providing microseconds. (milli-, micro-, nano-)
thanks a lot @neuralmer. Answer updated and whole code re-benchmarked.
6

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.

Comments

2

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.

2 Comments

Do you have a better solution? Also honestly, I don't get what you are saying at all. What do you mean by "round up"?
Explain your solution with a practical example for better understanding
2

In typical Linux and Windows, time.time_ns() // 1_000_000 is cheaper than round(time.time() * 1000):

import time

def benchmark_time_time():
    start = time.time()
    for _ in range(10_000_000):
        round(time.time() * 1000)
    end = time.time()
    return end - start

def benchmark_time_time_ns():
    start = time.time()
    for _ in range(10_000_000):
        time.time_ns() // 1_000_000
    end = time.time()
    return end - start

time_time_duration = benchmark_time_time()
time_time_ns_duration = benchmark_time_time_ns()

print(time_time_duration)
print(time_time_ns_duration)
print(time_time_duration/time_time_ns_duration * 100 - 100)

It seems that round(time.time() * 1000) takes roughly 20~60% more time in Linuxes and ~100% in Windows, just roughly saying.

Comments

0

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

Comments

0

If you were already using pandas library, then you can view the current timestamp (in local time by default but the timezone can be changed) as nanoseconds since the UNIX epoch (using view()). Then to convert the nanoseconds into milliseconds resolution, divide the value by 1000000.

# for a single timestamp
pd.Timestamp('now').asm8.view('int64') // 10**6

# if a column (which is probably more common)
pd.Series([pd.Timestamp('now')]).view('int64') // 10**6

If you were using the numpy library, then numpy has datetime64 function where you can specify the resolution (ms in this case) and view it as int64. Note that unlike pandas, it's UTC time.

np.datetime64('now', 'ms').view('int64')

Comments

0

The datetime documentation show that timedelta implements maths operator

The code to copy:

from datetime import datetime, timedelta
current_time_float_millisecond = (datetime.now() - datetime.fromtimestamp(0)) / timedelta(0, 0, 1000)

here a python session step by step to show how we construct the formula:

Python 3.11.9 (main, Aug 13 2024, 02:18:20) [GCC 12.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime, timedelta
>>> current_time = datetime.now()
>>> current_time
datetime.datetime(2024, 8, 28, 12, 40, 50, 631009)
>>> datetime.fromtimestamp(0)
datetime.datetime(1970, 1, 1, 0, 0)
>>> timedelta(0, 0, 1000)
datetime.timedelta(microseconds=1000)
>>> current_time - datetime.fromtimestamp(0)
datetime.timedelta(days=19963, seconds=45650, microseconds=631009)
>>> (current_time - datetime.fromtimestamp(0)) / timedelta(0, 0, 1000)
1724848850631.009
>>> (19963*24*60*60+45650) * 1000 + 631009 / 1000
1724848850631.009

This solution was not posted (but multiple answer propose time.time() * 1000). It highlight the python type timedelta that allow to customize the formula easily for various unit (datetime.timedelta(microseconds=1) for μs)

Comments

-1

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

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.