将自纪元以来的时间戳转换为datetime.datetime

60

我有以下自纪元以来的时间戳:

Timestamp
1346114717972
1354087827000

我该如何将这些时间戳转换为特定的输出格式,例如 mm/dd/yyyy hr:min:sec

我尝试将它们转换为datetime.datetime,但失败了:

 >>> datetime.datetime.fromtimestamp(1346114717972)
 Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
 ValueError: timestamp out of range for platform time_t

我应该怎样做?


1
你的做法是正确的,只是你传递的是毫秒,而不是秒。请尝试使用 datetime.datetime.fromtimestamp(1346114717972/1000) - Kashyap
3个回答

73

我会使用time模块。

>>> import time
>>> time.gmtime(1346114717972/1000.)
time.struct_time(tm_year=2012, tm_mon=8, tm_mday=28, tm_hour=0, tm_min=45, tm_sec=17, tm_wday=1, tm_yday=241, tm_isdst=0)  

这将显示UTC/GMT时间戳。

由于提供的时间戳是自历元以来的毫秒数,而不是秒数,因此需要将时间戳除以1000。

然后使用strftime函数进行格式化,如下所示:

>>> time.strftime('%m/%d/%Y %H:%M:%S',  time.gmtime(1346114717972/1000.))
'08/28/2012 00:45:17'

哎呀...我以为是秒,所以计算出来自历元以来大约42685年,我觉得肯定出了什么问题... - mgilson
1
也许使用1e3代替1000.更好。 - zhangxaochen
@zhangxaochen 这两个值是相同的浮点数,对吧?但是如果有人在 Python 2 中忘记了在 1000 后面加上小数点,那么就会进行整数除法,可能会相差最多一秒钟。但在 Python 3 中不再是这种情况了。 - Arpad Horvath -- Слава Україні

62
假设毫秒分辨率:
import datetime

s = '1346114717972'
fmt = "%Y-%m-%d %H:%M:%S"

# local time
t = datetime.datetime.fromtimestamp(float(s)/1000.)
print t.strftime(fmt) # prints 2012-08-28 02:45:17

# utc time
t_utc = datetime.datetime.utcfromtimestamp(float(s)/1000.)
print t_utc.strftime(fmt) # prints 2012-08-28 00:45:17

请查看strftime()strptime()的文档,其中详细介绍了它们的行为。

14
请注意,本回答将把时间戳转换为本地日期时间。如果您想要等效的UTC日期时间,请使用datetime.datetime.utcfromtimestamp()而不是datetime.datetime.fromtimestamp()。 - Marc

5

这是我见过的最简单的方法 -


(注意:保留了HTML标签,没有进行解释)
$ python
Python 2.7.5 (default, Nov  6 2016, 00:28:07) 
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> print(time.strftime('%Y-%m-%dT%H:%M:%S %Z',time.localtime(time.time())))
2018-05-02T13:21:44 IST

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接