Does time.time() in the Python time module return the system's time or the time in UTC?
-
120Timestamps don't have timezones. They represent a number of seconds since the epoch. The epoch is a specific moment in time which doesn't depend on the timezone.jwg– jwg2016-01-29 09:48:57 +00:00Commented Jan 29, 2016 at 9:48
-
7@jwg: the commonly used POSIX timestamps do not count leap seconds and therefore they are not the "number of [elapsed SI] seconds since the epoch" (they are close).jfs– jfs2017-02-16 06:54:18 +00:00Commented Feb 16, 2017 at 6:54
-
10I don't think this is an accurate objection @J.F.Sebastian. Leap seconds are not 'elapsed seconds since the epoch'. They are changes in the time representations recorded by clocks which do not correspond to elapsed seconds.jwg– jwg2017-02-20 09:08:29 +00:00Commented Feb 20, 2017 at 9:08
-
4@J.F.Sebastian Sorry for the confusion. Leap seconds are not 'elapsed seconds'. Therefore timestamps, which are 'numbers of elapsed seconds', do not and should not include leap seconds.jwg– jwg2017-02-20 11:38:51 +00:00Commented Feb 20, 2017 at 11:38
-
7@jwg wrong. You can't erase physical time. POSIX timestamp is not the number of elapsed SI seconds. Here's an example: 3 seconds elapsed between "December 31, 2016 at 6:59:59pm" and "December 31, 2016 at 7:00:01pm" in New York but the difference in the corresponding POSIX timestamps is only 2 seconds (the leap second is not counted).jfs– jfs2017-02-20 12:22:25 +00:00Commented Feb 20, 2017 at 12:22
10 Answers
The time.time() function returns the number of seconds since the epoch, as a float. Note that “the epoch” is defined as the start of January 1st, 1970 in UTC. So the epoch is defined in terms of UTC and establishes a global moment in time. No matter where on Earth you are, “seconds past epoch” (time.time()) returns the same value at the same moment.
Here is some sample output I ran on my computer, converting it to a string as well.
>>> import time
>>> ts = time.time()
>>> ts
1355563265.81
>>> import datetime
>>> datetime.datetime.fromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
'2012-12-15 01:21:05'
>>>
The ts variable is the time returned in seconds. I then converted it to a human-readable string using the datetime library.
13 Comments
import time when datetime basically gives you timestamp. Just remove the milliseconds - str(datetime.datetime.now()).split('.')[0]time.time() is not in any timezone. "seconds since the epoch" is a term; it is not elapsed seconds since some point in time (epoch). You can convert it to your local time (with tz database) and/or UTC timezone easily. btw, if you drop .strftime() the result is (almost) the same (+/- microseconds).This is for the text form of a timestamp that can be used in your text files. (The title of the question was different in the past, so the introduction to this answer was changed to clarify how it could be interpreted as the time. [updated 2016-01-14])
You can get the timestamp as a string using the .now() or .utcnow() of the datetime.datetime:
>>> import datetime
>>> print datetime.datetime.utcnow()
2012-12-15 10:14:51.898000
The now differs from utcnow as expected -- otherwise they work the same way:
>>> print datetime.datetime.now()
2012-12-15 11:15:09.205000
You can render the timestamp to the string explicitly:
>>> str(datetime.datetime.now())
'2012-12-15 11:15:24.984000'
Or you can be even more explicit to format the timestamp the way you like:
>>> datetime.datetime.now().strftime("%A, %d. %B %Y %I:%M%p")
'Saturday, 15. December 2012 11:19AM'
If you want the ISO format, use the .isoformat() method of the object:
>>> datetime.datetime.now().isoformat()
'2013-11-18T08:18:31.809000'
You can use these in variables for calculations and printing without conversions.
>>> ts = datetime.datetime.now()
>>> tf = datetime.datetime.now()
>>> te = tf - ts
>>> print ts
2015-04-21 12:02:19.209915
>>> print tf
2015-04-21 12:02:30.449895
>>> print te
0:00:11.239980
6 Comments
import datetime; print "%s: My timestamp message" % datetime.datetime.utcnow() Python3: import datetime; print ("%s: My timestamp message" % datetime.datetime.utcnow())datetime.datetime.utcnow() is evil. It creates a naive datetime that is not local time. Unless your local time is UTC, it will be WRONG. Use datetime.datetime.now(datetime.timezone.utc) instead. This creates a timezone aware datetime representing the current time.Based on the answer from #squiguy, to get a true timestamp I would type cast it from float.
>>> import time
>>> ts = int(time.time())
>>> print(ts)
1389177318
At least that's the concept.
8 Comments
type(time.time()) gives <type 'float'>int() is polymorphic. It would return long if necessary on old Python versions -- all integers are long on new Python versions.The answer could be neither or both.
neither:
time.time()returns approximately the number of seconds elapsed since the Epoch. The result doesn't depend on timezone so it is neither UTC nor local time. Here's POSIX defintion for "Seconds Since the Epoch".both:
time.time()doesn't require your system's clock to be synchronized so it reflects its value (though it has nothing to do with local timezone). Different computers may get different results at the same time. On the other hand if your computer time is synchronized then it is easy to get UTC time from the timestamp (if we ignore leap seconds):from datetime import datetime utc_dt = datetime.utcfromtimestamp(timestamp)
On how to get timestamps from UTC time in various Python versions, see How can I get a date converted to seconds since epoch according to UTC?
5 Comments
time.time() function returns (it is very short). Your comment addresses some other question (you've changed your comment since I've started answering it. For the worse). An aside note; the word "correct" should be used sparingly (time zones are complicated—there is no silver bullet—only trade offs for a particular use-case).datetime.datetime.utcfromtimestamp(ts). Unless your local time is UTC, it will be WRONG, because it creates a naive datetime that is not local time. Use datetime.datetime.fromtimestamp(ts,datetime.timezone.utc) instead. This creates a timezone aware datetime representing the same instant as the timestamp.naive_dt.astimezone() wouldn't exist like implicit bytes.encode() no longer exists in Python 3. It is true that it is beneficial to work with UTC time internally in many cases. There are great many things can be said about datetime module (I've answered enough questions to get a gold badge) most are out of scope for the question: what time.time() returns.To get a local timestamp using datetime library, Python 3.x
#wanted format: year-month-day hour:minute:seconds
from datetime import datetime
# get time now
dt = datetime.now()
# format it to a string
timeStamp = dt.strftime('%Y-%m-%d %H:%M:%S')
# print it to screen
print(timeStamp)
1 Comment
There is no such thing as an "epoch" in a specific timezone. The epoch is well-defined as a specific moment in time, so if you change the timezone, the time itself changes as well. Specifically, this time is Jan 1 1970 00:00:00 UTC. So time.time() returns the number of seconds since the epoch.
1 Comment
I eventually settled for:
>>> import time
>>> time.mktime(time.gmtime())
1509467455.0
1 Comment
time.time() returns decimal/float like 1574115250.818733 and milliseconds-since-epoch is easily int(time.time() * 1000) e.g. 1574115254915timestamp is always time in utc, but when you call datetime.datetime.fromtimestamp it returns you time in your local timezone corresponding to this timestamp, so result depend of your locale.
>>> import time, datetime
>>> time.time()
1564494136.0434234
>>> datetime.datetime.now()
datetime.datetime(2019, 7, 30, 16, 42, 3, 899179)
>>> datetime.datetime.fromtimestamp(time.time())
datetime.datetime(2019, 7, 30, 16, 43, 12, 4610)
There exist nice library arrow with different behaviour. In same case it returns you time object with UTC timezone.
>>> import arrow
>>> arrow.now()
<Arrow [2019-07-30T16:43:27.868760+03:00]>
>>> arrow.get(time.time())
<Arrow [2019-07-30T13:43:56.565342+00:00]>
Comments
time.time() return the unix timestamp.
you could use datetime library to get local time or UTC time.
import datetime
local_time = datetime.datetime.now()
print(local_time.strftime('%Y%m%d %H%M%S'))
utc_time = datetime.datetime.utcnow()
print(utc_time.strftime('%Y%m%d %H%M%S'))
1 Comment
utc_time from .utcnow() is ok as as string but dangerous as a datetime object. since it's naive, it might resemble UTC but it still behaves like local time if you do anything with it in your Python script (e.g. timedelta arithmetic).Python’s time.time() does not carry any timezone information at all.
Think of it as a raw counter: “seconds elapsed since 1970-01-01T00:00:00 UTC (ignoring leap seconds)”.
That’s why the value you get on two computers is identical at the same instant, even if one is in Tokyo and the other in New York.
import time, datetime, zoneinfo # Py3.9+
ts = time.time() # 1️⃣ raw POSIX timestamp (float)
utc = datetime.datetime.fromtimestamp(ts, tz=datetime.timezone.utc)
local = utc.astimezone(zoneinfo.ZoneInfo("Asia/Shanghai")) # pick any TZ
print(ts) # 1714974826.123
print(utc) # 2025-05-06 08:53:46.123+00:00
print(local) # 2025-05-06 16:53:46.123+08:00
Key points:
time.time()⟶ timezone-agnostic number.Use
datetime.fromtimestamp(ts, tz)to attach a timezone; passtimezone.utcfor UTC, or anyzoneinfoobject for local time.Never combine a naïve datetime (no tzinfo) with arithmetic unless you’re 100 % sure it represents UTC.
If you just need a quick visual check of a timestamp—especially to see whether it’s in seconds or milliseconds—you can paste it into my open-source converter https://timestamps.rs/ (disclosure: I built it). It auto-detects the unit, shows both UTC and local time, and copies ISO-8601 back to your clipboard.