在Python中将unix时间戳(长度13)字符串转换为可读日期

在Python中将unix时间戳(长度13)字符串转换为可读日期,python,unix,unix-timestamp,Python,Unix,Unix Timestamp,我试图将这个unix时间戳1491613677888转换为可读日期。 在此处(stackoverflow)找到python脚本: import datetime print( datetime.datetime.fromtimestamp( int("1284101485") ).strftime('%Y-%m-%d %H:%M:%S') ) 但当我把时间戳放在那里时,我得到了一个错误: Traceback (most recent call last): File

我试图将这个unix时间戳1491613677888转换为可读日期。 在此处(stackoverflow)找到python脚本:

import datetime
print(
    datetime.datetime.fromtimestamp(
    int("1284101485")
    ).strftime('%Y-%m-%d %H:%M:%S')
)
但当我把时间戳放在那里时,我得到了一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 22] Invalid argument
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
OSError:[Errno 22]参数无效
现在我看到我正在使用的时间戳长了3个字符。 我在这个链接上查看了它:

并看到这是从中得到时间。 如何使用python实现这一点?
(我使用的是python 3.4)

您的时间戳长了3个字符,是标准的unix时间戳吗?这意味着你的时间戳至少是从今天开始的40000年。否则,最后3个字符可能表示其他内容,如毫秒,但这不能解释您看到的错误

如果它们是毫秒,并且看到您没有在格式字符串中使用它们,我认为简单地剥离它们没有什么害处

standard_unix_ts = int("1284101485000"[:-3])
编辑考虑到@cdarke的评论,我建议改为:

standard_unix_ts = int("1284101485000"[:10])
编辑2以下Gils评论

import datetime

not_unix_ts = "1284101485088"
unix_ts, milliseconds = not_unix_ts[:10], not_unix_ts[10:]
dt = datetime.datetime.fromtimestamp(float(unix_ts))
FORMAT_STRING = '%Y-%m-%d %H:%M:%S'
print("%s and %s milliseconds" % (dt.strftime(FORMAT_STRING), milliseconds))

您的
时间戳
不是“经典”Unix时间戳(自1970年1月1日以来的秒数),因为它是以毫秒表示的

你可以这样翻译:

import datetime

timestamp_with_ms = 1491613677888

# We separate the 'ordinary' timestamp and the milliseconds
timestamp, ms = divmod(timestamp_with_ms, 1000)
#1491613677 888

# We create the datetime from the timestamp, we must add the 
# milliseconds separately
dt = datetime.datetime.fromtimestamp(timestamp) + datetime.timedelta(milliseconds=ms)


formatted_time = dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
# With Python 3.6, you could use:
# formatted_time = dt.isoformat(sep=' ', timespec='milliseconds')

print(formatted_time)
# 2017-04-08 03:07:57.888
Edit:我没有注意到
fromtimestamp
接受浮点数。因此,我们可以简单地做到:

import datetime
timestamp_with_ms = 1491613677888

dt = datetime.datetime.fromtimestamp(timestamp_with_ms / 1000)

formatted_time = dt.strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]
# With Python 3.6, you could use:
# formatted_time = dt.isoformat(sep=' ', timespec='milliseconds')

print(formatted_time)
# 2017-04-08 03:07:57.888

无法复制(python2.7+3)时间戳中的最后888是从哪里得到的?第一部分是2017-04-08T01:07:57+00:00,这可能是您想要的。有了它,你的代码运行得非常好。你是从某个以毫秒为单位输出它的函数中得到的吗?当我在Python 2上使用
int(“1284101485888”)
时,我得到了ValueError:year超出了范围,在Python 3.6上我得到了42661-07-22 17:11:28。关于@thierrylahuille注释。是的,我需要毫秒。我如何在python 3.4中使用它?只是想一想,如果有正确长度的时间戳,使用前10个字符可能比去掉最后3个字符更安全。非常有效的注释,我完全同意。在我添加的链接中,我看到了毫秒,我需要它们。该时间戳是密钥的一部分。我需要全部。那么,在Python3.4中如何获得毫秒呢?只需将它们从字符串中去掉,给您一个实时戳,最后3个字符表示毫秒。重新迭代:unix时间戳不包括毫秒,所以库解析它们时出现问题是可以理解的。我有我的答案来更好地证明这一点。