5

我有一个包含毫秒的 unix 时间戳列表——它们的长度为 13 位。当我通过它运行时间戳时,datetime.fromtimestamp(unix_timestamp)它会返回一个ValueError: Year Out of Range. 当我从时间戳中去掉最后三位数字并通过相同的格式转换器运行它时,它工作得很好。是否可以通过 datetime 的 fromtimestamp 方法运行包含毫秒的 Unix 时间戳而不引发 ValueError?我正在查看文档,它没有说明任何关于指定毫秒的内容。

任何帮助都是极好的!

4

5 回答 5

9

从文档中,您可以看到 Python 中的时间戳预计以秒计算,而不是毫秒:http ://docs.python.org/2/library/time.html#time.time

你可能已经讨论过了。

不过,切掉时间戳的最后 3 位数字应该相当容易:

datetime.fromtimestamp(str(unix_timestamp)[0:-3])

您可能还希望进行一些字符串长度检查以验证它们的长度是 13 位而不是 10 位:

if len(unix_timestamp) == 13:
    unix_timestamp = float(str(unix_timestamp)[0:-3])

datetime.fromtimestamp(unix_timestamp)

顺便说一句,在某些系统上,时间戳必须在 1970 - 2038 之间。这也可能导致ValueError.

如果你想保持毫秒,你可以像这样存储它们:

milliseconds = 0
if len(unix_timestamp) == 13:
    milliseconds = int(unix_timestamp[-3:])
    unix_timestamp = float(unix_timestamp[0:-3])

the_date = datetime.fromtimestamp(unix_timestamp)
the_date += timedelta(milliseconds=milliseconds)
于 2013-09-10T16:18:13.013 回答
4

fromtimestamp方法需要一个 unix 时间戳,其分辨率为秒。您必须分两步转换时间:

mytime = datetime.fromtimestamp(timestamp/1000)
                 .replace(microsecond = (timestamp % 1000) * 1000)
于 2013-09-10T16:21:52.047 回答
2

@Jordan 的解释非常好,但我认为我面临的解析可能有错误,所以我将代码整理如下:

datetime.datetime.fromtimestamp(float(str(timestamp)[0:-3]))
于 2015-06-03T11:12:23.477 回答
1

只需将时间戳值除以 1000。

datetime.fromtimestamp(unix_timestamp/1000.0)
于 2015-09-07T08:08:40.010 回答
0

如果unix_timestamp_millis包含“自纪元以来的毫秒数”并且您想使用datetime.fromtimestamp()方法获取本地时间(@Chronial 答案的变体):

#!/usr/bin/env python
from datetime import datetime

seconds, millis = divmod(unix_timestamp_millis, 1000)
local_dt = datetime.fromtimestamp(seconds).replace(microsecond=millis*1000)

要考虑本地时区规则随时间可能发生的变化,您可以通过模块使用tz 数据库:pytz

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

local_timezone = get_localzone() # get pytz tzinfo object   
seconds, millis = divmod(unix_timestamp_millis, 1000)
local_dt = datetime.fromtimestamp(seconds, local_timezone)
local_dt = local_dt.replace(microsecond=millis*1000)

结果是一个时区感知的日期时间对象。

如果您无法安装第 3 方模块,请使用 UTC 时间:

#!/usr/bin/env python
from datetime import datetime

seconds, millis = divmod(unix_timestamp_millis, 1000)
utc_dt = datetime.utcfromtimestamp(seconds).replace(microsecond=millis*1000)

如果输入是以毫秒数给出的POSIX 时间戳(可能;除非使用“正确”时区),那么您可以通过直接公式找到分解的 UTC 时间:

#!/usr/bin/env python
from datetime import datetime, timedelta

utc_dt = datetime(1970, 1, 1) + timedelta(milliseconds=unix_timestamp_millis)
于 2015-06-03T18:34:56.317 回答