ChatGPT解决这个技术问题 Extra ChatGPT

Converting unix timestamp string to readable date

I have a string representing a unix timestamp (i.e. "1284101485") in Python, and I'd like to convert it to a readable date. When I use time.strftime, I get a TypeError:

>>>import time
>>>print time.strftime("%B %d %Y", "1284101485")

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: argument must be 9-item sequence, not str
link to question for converting back too: stackoverflow.com/q/19801727/3273031

J
Jaroslav Bezděk

Use datetime module:

from datetime import datetime
ts = int('1284101485')

# if you encounter a "year is out of range" error the timestamp
# may be in milliseconds, try `ts /= 1000` in that case
print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S'))

.fromtimestamp() might fail for past dates if a local timezone had different utc offset. You need a historic timezone database such as provided by pytz module (or your OS). Or just work in UTC and use .utcfromtimestamp().
@J.F.Sebastian You've mentioned this might fail in a couple of comments - please could you elaborate as to why it would fail for a past dates/times? (Judging by the upvotes, many people both agree with you and see this as straightforward) Surely any unix timestamp has a simple equivalent date/time?
@davidhood2 take a system where python has no access to the tz database (Windows), set your local timezone to a timezone that had a different UTC offset in the past (e.g. Europe/Moscow), call fromtimestamp() with timestamps from the past (2011-). Compare the results with values computed using pytz. If it is unclear; ask a separate Stack Overflow question.
An import point is this takes a timestamp in seconds since the epoch; if you have milliseconds you have to divide by 1000 as I just found out.
D
Daniel
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

Taken from http://seehuhn.de/pages/pdate


This method return an datetime.datetime object. This can be printed as it has the magic __str__() method included. Also check out the [best comment][1], so print(datetime.utcfromtimestamp(unix_time_value) will make it human-readable. [1]: stackoverflow.com/questions/3682748/…
r
rkachach

The most voted answer suggests using fromtimestamp which is error prone since it uses the local timezone. To avoid issues a better approach is to use UTC:

datetime.datetime.utcfromtimestamp(posix_time).strftime('%Y-%m-%dT%H:%M:%SZ')

Where posix_time is the Posix epoch time you want to convert


import datetime, pytz datetime.datetime(1990, 1, 1, tzinfo=pytz.utc)
beware, unix time might be different from posix time in (rare) cases e.g., TZ=right/UTC date vs. TZ=UTC date is Mon 7 Sep 15:58:05 UTC 2020 vs. Mon 7 Sep 15:58:32 UTC 2020 (the difference may change depending on the number of leap seconds)
ValueError: year 53085 is out of range
@alper In such cases, likely one has a timestamp in milliseconds; try dividing by 1000. Or by 1000000 if the timestamp is in microseconds.
J
John La Rooy
>>> import time
>>> time.ctime(int("1284101485"))
'Fri Sep 10 16:51:25 2010'
>>> time.strftime("%D %H:%M", time.localtime(int("1284101485")))
'09/10/10 16:51'

time.ctime() and time.localtime() might fail for past dates if a local timezone had different utc offset. You need a historic timezone database such as provided by pytz module (or your OS). Or just work in UTC and use time.gmtime(). datetime might provide wider date range so datetime.utcfromtimestamp() could be used instead of time functions.
@John La Rooy is there a similar method to convert back from date-time string back to the Unix timestamp?
j
jfs

There are two parts:

Convert the unix timestamp ("seconds since epoch") to the local time Display the local time in the desired format.

A portable way to get the local time that works even if the local time zone had a different utc offset in the past and python has no access to the tz database is to use a pytz timezone:

#!/usr/bin/env python
from datetime import datetime
import tzlocal  # $ pip install tzlocal

unix_timestamp = float("1284101485")
local_timezone = tzlocal.get_localzone() # get pytz timezone
local_time = datetime.fromtimestamp(unix_timestamp, local_timezone)

To display it, you could use any time format that is supported by your system e.g.:

print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))
print(local_time.strftime("%B %d %Y"))  # print date in your format

If you do not need a local time, to get a readable UTC time instead:

utc_time = datetime.utcfromtimestamp(unix_timestamp)
print(utc_time.strftime("%Y-%m-%d %H:%M:%S.%f+00:00 (UTC)"))

If you don't care about the timezone issues that might affect what date is returned or if python has access to the tz database on your system:

local_time = datetime.fromtimestamp(unix_timestamp)
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f"))

On Python 3, you could get a timezone-aware datetime using only stdlib (the UTC offset may be wrong if python has no access to the tz database on your system e.g., on Windows):

#!/usr/bin/env python3
from datetime import datetime, timezone

utc_time = datetime.fromtimestamp(unix_timestamp, timezone.utc)
local_time = utc_time.astimezone()
print(local_time.strftime("%Y-%m-%d %H:%M:%S.%f%z (%Z)"))

Functions from the time module are thin wrappers around the corresponding C API and therefore they may be less portable than the corresponding datetime methods otherwise you could use them too:

#!/usr/bin/env python
import time

unix_timestamp  = int("1284101485")
utc_time = time.gmtime(unix_timestamp)
local_time = time.localtime(unix_timestamp)
print(time.strftime("%Y-%m-%d %H:%M:%S", local_time)) 
print(time.strftime("%Y-%m-%d %H:%M:%S+00:00 (UTC)", utc_time))  

It should be the most voted answer if you care about local time.
if you get ValueError: year xxx is out of range error divide your timestamp to /1000 stackoverflow.com/a/31548402/1428241
@jfs is there a similar method to convert back from date-time string back to the Unix timestamp?
@ENV: once you've parsed your input time string into an aware datetime object, just call its .timestamp() method. How to convert the time string depends on its format -- it is ambiguous in the general case but there are many solution for various cases.
C
Contango

In Python 3.6+:

import datetime

timestamp = 1642445213
value = datetime.datetime.fromtimestamp(timestamp)
print(f"{value:%Y-%m-%d %H:%M:%S}")

Output (local time)

2022-01-17 20:46:53

Explanation

Line #1: Import datetime library.

Line #2: Unix time which is seconds since 1970-01-01.

Line #3: Converts this to a unix time object, check with: type(value)

Line #4: Prints in the same format as strp. Local time. To print in UTC see example below.

Bonus

To save the date to a string then print it, use this:

my_date = f"{value:%Y-%m-%d %H:%M:%S}"
print(my_date)

To output in UTC:

value = datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc)
# 2022-01-17 18:50:52

Great answer, but whish you showed how you could save the date to a string, and not just print it: value.strftime('%Y-%m-%d %H:%M:%S')
@bjornasm Sure, updated answer with a similar method to achieve this.
f-strings are specific to Python v3.6+ - stackoverflow.com/a/51262245/4442148
The output is not UTC but local time, unless you set the tz argument in fromtimestamp, e.g. to datetime.timezone.utc.
@MrFruppes Correct. Edited answer on 2022-01-17 to fix this.
s
shubham

Other than using time/datetime package, pandas can also be used to solve the same problem.Here is how we can use pandas to convert timestamp to readable date:

Timestamps can be in two formats:

13 digits(milliseconds) - To convert milliseconds to date, use: import pandas result_ms=pandas.to_datetime('1493530261000',unit='ms') str(result_ms) Output: '2017-04-30 05:31:01' 10 digits(seconds) - To convert seconds to date, use: import pandas result_s=pandas.to_datetime('1493530261',unit='s') str(result_s) Output: '2017-04-30 05:31:01'


J
Jared Burrows

For a human readable timestamp from a UNIX timestamp, I have used this in scripts before:

import os, datetime

datetime.datetime.fromtimestamp(float(os.path.getmtime("FILE"))).strftime("%B %d, %Y")

Output:

'December 26, 2012'


N
Nick

You can convert the current time like this

t=datetime.fromtimestamp(time.time())
t.strftime('%Y-%m-%d')
'2012-03-07'

To convert a date in string to different formats.

import datetime,time

def createDateObject(str_date,strFormat="%Y-%m-%d"):    
    timeStamp = time.mktime(time.strptime(str_date,strFormat))
    return datetime.datetime.fromtimestamp(timeStamp)

def FormatDate(objectDate,strFormat="%Y-%m-%d"):
    return objectDate.strftime(strFormat)

Usage
=====
o=createDateObject('2013-03-03')
print FormatDate(o,'%d-%m-%Y')

Output 03-03-2013

A
Alberto Bonsanto
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

Get the readable date from timestamp with time also, also you can change the format of the date.


What does this answer add to this answer?
Please add a warning related to issue of local timezone assumption. Best practices in programming is to store timestamps as UTC times instead of local timestamps. But this example above will return the wrong time if the local timezone is not UTC.
F
FObersteiner

Note that utcfromtimestamp can lead to unexpected results since it returns a naive datetime object. Python treats naive datetime as local time - while UNIX time refers to UTC.

This ambiguity can be avoided by setting the tz argument in fromtimestamp:

from datetime import datetime, timezone

dtobj = datetime.fromtimestamp(1284101485, timezone.utc)

>>> print(repr(dtobj))
datetime.datetime(2010, 9, 10, 6, 51, 25, tzinfo=datetime.timezone.utc)

Now you can format to string, e.g. an ISO8601 compliant format:

>>> print(dtobj.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))
2010-09-10T06:51:25.000Z

R
Rachel Gallen

Use the following codes, I hope it will solve your problem.

import datetime as dt

print(dt.datetime.fromtimestamp(int("1284101485")).strftime('%Y-%m-%d %H:%M:%S'))

add an explanation re, why this code will solve the problem to improve your answer.
i
itsaruns
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp

h
h3xus

Another way that this can be done using gmtime and format function;

from time import gmtime
print('{}-{}-{} {}:{}:{}'.format(*gmtime(1538654264.703337)))

Output: 2018-10-4 11:57:44


M
Mushfirat Mohaimin

If you are working with a dataframe and do not want the series cannot be converted to class int error. Use the code below.

new_df= pd.to_datetime(df_new['time'], unit='s')

n
nimmy

i just successfully used:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date

R
Raphael Amoedo

You can use easy_date to make it easy:

import date_converter
my_date_string = date_converter.timestamp_to_string(1284101485, "%B %d, %Y")

Every programming has it's own date and time converters. One should never have to use mods/frameworks for this
strptime and strftime isn't intuitive... And even not readable... But I understand and respect your opinion
That one should "never have to use" is wrong. It depends on the language and the quality of the built-in libs. Javascript has moments.js and Java had Joda time which both are more popular than the respective built-in date and time conversion utils (so much that Joda time later influenced Java 8's updated standard libs). That said, unless the question calls for nice third-party libraries, it's preferable to give an answer based on the standard library.
I stand corrected @NikosVentouras. I've just had the "JS Date in IE behaves differently" issue for the first time. So I ended up using moment.js
N
Nick Tsai

Use datetime.strftime(format):

from datetime import datetime
unixtime = int('1284101485')

# Print with local time
print(datetime.fromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))

# Print with UTC time
print(datetime.utcfromtimestamp(unixtime).strftime('%Y-%m-%d %H:%M:%S'))

datetime.fromtimestamp(timestamp): Return the local date corresponding to the POSIX timestamp, such as is returned by time.time().

datetime.utcfromtimestamp(timestamp): Return the UTC datetime corresponding to the POSIX timestamp, with tzinfo None. (The resulting object is naive.)


e
eqzx

quick and dirty one liner:

'-'.join(str(x) for x in list(tuple(datetime.datetime.now().timetuple())[:6]))

'2013-5-5-1-9-43'


Or more concisely: '-'.join(map(str, datetime.datetime.now().timetuple()[:6]))
@JelleZijlstra Eh, I much prefer the generator expression over map.
What kind of date format is '2013-5-5-1-9-43' ? I've never seen this format anywhere as a valid representation of a date/time.
can you elaborate on what qualifies this as an invalid representation @madoki ? do you mean nonstandard? The primary advantage it has over most other answers is the ability to include it in a file or directory path, as spaces and colons are not in the set of standard unix directory characters. see e.g. stackoverflow.com/a/458001/209246