日期时间Unix时间戳包含毫秒

时间:2013-09-10 16:14:34

标签: python unix datetime

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

任何帮助都会很棒!

5 个答案:

答案 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)