【问题标题】:Convert timestamp since epoch to datetime.datetime将自纪元以来的时间戳转换为 datetime.datetime
【发布时间】:2012-09-17 11:50:41
【问题描述】:

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

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

我该怎么做?

【问题讨论】:

  • 您所做的是正确的,只是您通过的是毫秒而不是秒。试试datetime.datetime.fromtimestamp(1346114717972/1000)

标签: python


【解决方案1】:

我会使用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 年,我认为那里一定有问题...
  • 也许使用1e3而不是1000.会更好
  • @zhangxaochen 是一样的吧?它们是相同的浮点值。但是可以肯定的是,如果有人在 Python 2 中忘记了 1000 之后的点,那么它是一个整数除法,最多可能有一秒的差异。但在 Python 3 中不再是这种情况了。
【解决方案2】:

假设毫秒分辨率:

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() and strptime() behavior 的文档。

【讨论】:

  • 请注意,此答案会将时间戳转换为本地日期时间。如果您想要 UTC 中的等效日期时间,请使用 datetime.datetime.utcfromtimestamp() 而不是 datetime.datetime.fromtimestamp()。
【解决方案3】:

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

$ 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-19
    • 1970-01-01
    • 2015-10-19
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    相关资源
    最近更新 更多