将 unix 时间戳字符串转换为可读日期

Converting unix timestamp string to readable date

提问人:VeryNewToPython 提问时间:9/10/2010 最后编辑:kabr8VeryNewToPython 更新时间:6/10/2022 访问量:1606237

问:

我在 Python 中有一个表示 unix 时间戳(即“1284101485”)的字符串,我想将其转换为可读日期。当我使用 时,我得到一个:time.strftimeTypeError

>>>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
python 日期时间 unix-timestamp strftime

评论

4赞 slushy 11/9/2018
转换回的问题链接:stackoverflow.com/q/19801727/3273031

答:

322赞 Daniel 9/10/2010 #1
>>> from datetime import datetime
>>> datetime.fromtimestamp(1172969203.1)
datetime.datetime(2007, 3, 4, 0, 46, 43, 100000)

摘自 http://seehuhn.de/pages/pdate

评论

0赞 PythoNic 7/14/2022
此方法返回 datetime.datetime 对象。这可以打印出来,因为它包含了魔术 __str__() 方法。还要查看 [最佳评论][1],因此将使其具有人类可读性。[1]:stackoverflow.com/questions/3682748/......print(datetime.utcfromtimestamp(unix_time_value)
1559赞 Michał Niklas 9/10/2010 #2

使用模块:datetime

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

评论

161赞 jfs 11/23/2013
.fromtimestamp()如果本地时区具有不同的 UTC 偏移量,则过去的日期可能会失败。您需要一个历史时区数据库,例如由模块(或您的操作系统)提供。或者只是在UTC中工作并使用.pytz.utcfromtimestamp()
11赞 davidhood2 11/22/2016
@J.F.Sebastian:您在几条评论中提到这可能会失败 - 请您详细说明为什么它会在过去日期/时间失败?(从赞成票来看,很多人都同意你的观点,并认为这很简单)当然,任何 unix 时间戳都有一个简单的等效日期/时间吗?
4赞 jfs 11/22/2016
@davidhood2采用python无法访问tz数据库的系统(Windows),将本地时区设置为过去具有不同UTC偏移量的时区(例如欧洲/莫斯科),使用过去的时间戳(2011-)调用fromtimestamp()。将结果与使用 计算的值进行比较。如果不清楚;提出一个单独的 Stack Overflow 问题。pytz
4赞 jfs 11/24/2016
@davidhood2:我已经发布了我自己的答案,演示了pytz解决方案
10赞 wordsforthewise 6/14/2017
一个导入点是,它采用自纪元以来的时间戳(以秒为单位);如果你有毫秒,你必须除以 1000,正如我刚刚发现的那样。
91赞 John La Rooy 9/10/2010 #3
>>> 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'

评论

12赞 jfs 11/23/2013
time.ctime()如果本地时区具有不同的 UTC 偏移量,则过去的日期可能会失败。您需要一个历史时区数据库,例如由模块(或您的操作系统)提供。或者只是在UTC中工作并使用. 可能会提供更宽的日期范围,因此可以代替函数使用。time.localtime()pytztime.gmtime()datetimedatetime.utcfromtimestamp()time
0赞 ENV 6/10/2021
@John La Rooy 有没有类似的方法可以将日期时间字符串转换回 Unix 时间戳?
29赞 Nick 3/7/2012 #4

您可以像这样转换当前时间

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

将字符串中的日期转换为不同的格式。

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
38赞 Jared Burrows 12/27/2012 #5

对于 UNIX 时间戳中人类可读的时间戳,我之前在脚本中使用过它:

import os, datetime

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

输出:

'2012年12月26日'

评论

0赞 kdubs 9/26/2023
我不需要浮子。只是这个: datetime.fromtimestamp(path.getmtime('file')).strftime(“%B %d, %Y”)
0赞 eqzx 5/5/2013 #6

快速而肮脏的一个衬垫:

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

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

评论

3赞 Jelle Zijlstra 6/11/2014
或者更简洁地说:'-'.join(map(str, datetime.datetime.now().timetuple()[:6]))
2赞 crhodes 8/24/2015
@JelleZijlstra 呃,我更喜欢生成器表达式而不是地图。
6赞 madoki 2/10/2016
“2013-5-5-1-9-43”是什么日期格式?我从未在任何地方看到过这种格式作为日期/时间的有效表示。
0赞 eqzx 2/23/2018
您能否详细说明这符合无效表示@madoki的资格?你是说非标准吗?与大多数其他答案相比,它的主要优点是能够将其包含在文件或目录路径中,因为空格和冒号不在标准 unix 目录字符集中。参见例如 stackoverflow.com/a/458001/209246
7赞 itsaruns 2/5/2014 #7
import datetime
temp = datetime.datetime.fromtimestamp(1386181800).strftime('%Y-%m-%d %H:%M:%S')
print temp
1赞 nimmy 1/16/2015 #8

我刚刚成功使用了:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
1赞 Raphael Amoedo 5/15/2015 #9

您可以使用easy_date来简化操作:

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

评论

5赞 Jos 12/9/2015
每个节目都有自己的日期和时间转换器。为此,人们永远不必使用模组/框架
1赞 Raphael Amoedo 12/10/2015
strptime而且不直观......甚至不可读......但我理解并尊重你的意见strftime
6赞 Hejazzman 12/23/2015
认为“永远不必使用”是错误的。这取决于语言和内置库的质量。Javascript 有时刻.js而 Java 有 Joda 时间,两者都比各自内置的日期和时间转换工具更受欢迎(以至于 Joda time 后来影响了 Java 8 更新的标准库)。也就是说,除非问题需要好的第三方库,否则最好根据标准库给出答案。
1赞 Jos 1/19/2016
我纠正@NikosVentouras。我刚刚第一次遇到“IE 中的 JS 日期行为不同”的问题。所以我最终使用了 moment.js
196赞 rkachach 5/12/2016 #10

得票最多的答案建议使用 fromtimestamp,因为它使用本地时区,因此容易出错。为了避免问题,更好的方法是使用 UTC:

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

其中posix_time是要转换的 Posix 纪元时间

评论

2赞 y.selivonchyk 6/24/2017
导入 datetime, pytz datetime.datetime(1990, 1, 1, tzinfo=pytz.utc)
0赞 jfs 9/7/2020
请注意,在(罕见)情况下,UNIX 时间可能与 POSIX 时间不同,例如 vs. 是 vs. (差异可能会根据闰秒数而变化)TZ=right/UTC dateTZ=UTC dateMon 7 Sep 15:58:05 UTC 2020Mon 7 Sep 15:58:32 UTC 2020
2赞 alper 2/12/2021
ValueError: year 53085 is out of range
7赞 ShreevatsaR 6/21/2021
@alper 在这种情况下,可能有一个以毫秒为单位的时间戳;尝试除以 1000。如果时间戳以微秒为单位,则为 1000000。
0赞 Jack M 1/19/2023
“it uses the local timezone”到底是什么意思?它是否假定时间戳是指自本地时区 1/1/70 以来经过的秒数?或者它是否正确地假设时间戳是自 UTC 中 1/1/70 以来的秒数,然后以本地时区表示结果日期/时间?
92赞 jfs 11/24/2016 #11

分为两部分:

  1. 将 unix 时间戳(“自纪元以来的秒数”)转换为本地时间
  2. 以所需格式显示本地时间。

即使过去本地时区具有不同的 UTC 偏移量并且 python 无法访问 tz 数据库,获取本地时间的一种可移植方法是使用时区:pytz

#!/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)

要显示它,您可以使用系统支持的任何时间格式,例如:

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

如果您不需要本地时间,请改为获取可读的 UTC 时间:

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

如果您不关心可能影响返回日期的时区问题,或者 python 是否有权访问您系统上的 tz 数据库:

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

在 Python 3 上,您可以仅使用 stdlib 获得时区感知的日期时间(如果 python 无法访问系统上的 tz 数据库,例如在 Windows 上,则 UTC 偏移量可能是错误的):

#!/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)"))

该模块中的函数是围绕相应 C API 的精简包装器,因此它们的可移植性可能不如相应的方法,否则您也可以使用它们:timedatetime

#!/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))  

评论

0赞 azzamsa 9/20/2019
如果您关心当地时间,它应该是投票最多的答案。
0赞 Barlas Apaydin 5/7/2021
如果收到 ValueError: year xxx is out of range 错误,请将时间戳除以 /1000 stackoverflow.com/a/31548402/1428241
0赞 ENV 6/10/2021
@jfs有没有类似的方法可以将日期时间字符串转换回 Unix 时间戳?
0赞 jfs 6/11/2021
@ENV:将输入时间字符串解析为感知 DateTime 对象后,只需调用其方法即可。如何转换时间字符串取决于其格式 - 在一般情况下是模棱两可的,但对于各种情况有很多解决方案。.timestamp()
45赞 shubham 3/7/2018 #12

除了使用 time/datetime 包外,pandas 还可以用于解决相同的问题。以下是我们如何使用 pandas时间戳转换为可读日期

时间戳可以采用两种格式:

  1. 13 位(毫秒) - 若要将毫秒转换为日期,请使用:

    import pandas
    result_ms=pandas.to_datetime('1493530261000',unit='ms')
    str(result_ms)
    
    Output: '2017-04-30 05:31:01'
    
  2. 10 位(秒) - 若要将秒数转换为日期,请使用:

    import pandas
    result_s=pandas.to_datetime('1493530261',unit='s')
    str(result_s)
    
    Output: '2017-04-30 05:31:01'
    
24赞 Rishabh Jhalani 8/16/2018 #13
timestamp ="124542124"
value = datetime.datetime.fromtimestamp(timestamp)
exct_time = value.strftime('%d %B %Y %H:%M:%S')

从带有时间的时间戳中获取可读日期,您也可以更改日期的格式。

评论

7赞 kocica 12/30/2018
这个答案对这个答案有什么补充?
1赞 Timothy C. Quinn 5/13/2019
请添加与本地时区假设问题相关的警告。编程的最佳做法是将时间戳存储为 UTC 时间,而不是本地时间戳。但是,如果本地时区不是 UTC,上面的这个示例将返回错误的时间。
6赞 h3xus 1/21/2019 #14

另一种方法可以使用 gmtime 和 format 函数来完成此操作;

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

输出:2018-10-4 11:57:44

79赞 Contango 1/16/2020 #15

在 Python 3.6+ 中:

import datetime

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

输出(当地时间)

2022-01-17 20:46:53

解释

奖金

要将日期保存到字符串中然后打印,请使用以下命令:

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

要以 UTC 格式输出,请执行以下操作:

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

评论

0赞 bjornasm 6/7/2020
很好的答案,但是您展示了如何将日期保存到字符串中,而不仅仅是打印它:value.strftime('%Y-%m-%d %H:%M:%S')
0赞 Contango 6/8/2020
@bjornasm 当然,使用类似的方法更新答案来实现这一点。
1赞 essexboyracer 5/30/2021
f 字符串特定于 Python v3.6+ - stackoverflow.com/a/51262245/4442148
1赞 FObersteiner 1/17/2022
输出不是 UTC,而是本地时间,除非您在 中设置参数,例如 。tzfromtimestampdatetime.timezone.utc
0赞 Contango 1/18/2022
@MrFruppes正确。在 2022-01-17 上编辑了答案以解决此问题。
12赞 FObersteiner 11/30/2020 #16

请注意,这可能会导致意外结果,因为它返回一个幼稚的 datetime 对象。Python 将朴素的日期时间视为本地时间,而 UNIX 时间是指 UTC。utcfromtimestamp

这种歧义可以通过在以下位置设置参数来避免:tzfromtimestamp

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)

现在,您可以格式化为字符串,例如符合ISO8601格式:

>>> print(dtobj.isoformat(timespec='milliseconds').replace('+00:00', 'Z'))
2010-09-10T06:51:25.000Z
9赞 Deepak 5/10/2021 #17

使用以下代码,希望能解决您的问题。

import datetime as dt

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

评论

2赞 Rachel Gallen 5/10/2021
添加一个解释,为什么这段代码会解决问题,以改进你的答案。
4赞 tym 8/2/2021 #18

如果您正在处理数据帧并且不希望出现错误。使用下面的代码。series cannot be converted to class int

new_df= pd.to_datetime(df_new['time'], unit='s')
8赞 Nick Tsai 3/30/2022 #19

使用 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'))