我有一个包含毫秒的unix时间戳列表 - 它们长13位。当我通过datetime.fromtimestamp(unix_timestamp)
运行时间戳时,它会返回ValueError: Year Out of Range
。当我从时间戳中删除最后三位数字并通过相同的格式转换器运行时,它的工作完美。是否可以通过datetime的fromtimestamp方法运行包含毫秒的Unix时间戳而不会引发ValueError?我正在查看文档,它没有说明指定毫秒。
任何帮助都会很棒!
答案 0 :(得分: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)
答案 1 :(得分:4)
fromtimestamp
方法需要一个unix时间戳,其分辨率为秒。您必须分两步转换您的时间:
mytime = datetime.fromtimestamp(timestamp/1000)
.replace(microsecond = (timestamp % 1000) * 1000)
答案 2 :(得分:2)
@Jordan的解释非常好,但我认为在解析时我可能会遇到错误,因此我将代码编码如下:
datetime.datetime.fromtimestamp(float(str(timestamp)[0:-3]))
答案 3 :(得分:1)
只需将时间戳值除以1000即可。
datetime.fromtimestamp(unix_timestamp/1000.0)
答案 4 :(得分:0)
如果unix_timestamp_millis
包含“自纪元以来的毫秒数”,并且您希望使用datetime.fromtimestamp()
方法获取当地时间(@Chronial's answer上的变体):
#!/usr/bin/env python
from datetime import datetime
seconds, millis = divmod(unix_timestamp_millis, 1000)
local_dt = datetime.fromtimestamp(seconds).replace(microsecond=millis*1000)
要考虑到当地时区规则可能发生的变化,您可以通过pytz
模块使用the tz database:
#!/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)
结果是一个时区感知的日期时间对象。
如果您无法安装第三方模块,请使用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 timestamp给定的毫秒数(可能;除非使用“正确”的时区),那么您可以通过直接公式找到分解的UTC时间:
#!/usr/bin/env python
from datetime import datetime, timedelta
utc_dt = datetime(1970, 1, 1) + timedelta(milliseconds=unix_timestamp_millis)