datetime到Unix时间戳,精度为毫秒

时间:2011-11-16 23:32:34

标签: python datetime

我正在尝试做一些非常简单的事情,将未来三天的datetime对象转换为Unix UTC时间戳:

import datetime, time
then = datetime.datetime.now() + datetime.timedelta(days=3)
# Method 1
print then.strftime("%s")
# Method 2
print time.mktime(then.timetuple())
# Method 3 
print time.mktime(then.timetuple()) * 1000

方法1和2给出了中的Unix时间,而不是毫秒,方法3给出了毫秒,没有实际的毫秒精度。

当我只打印then时,我得到datetime.datetime(2011, 11, 19, 15, 16, 8, 278271),所以我知道精度可用几毫秒。如何获得具有实际毫秒精度的Unix时间戳?如果它作为浮点数返回,我必须将其展平为int,那很好。有没有我正在寻找的解决方案呢?

7 个答案:

答案 0 :(得分:42)

Datetime对象有一个名为microsecond的字段。因此,实现您所需要的一种方法是:

time.mktime(then.timetuple())*1e3 + then.microsecond/1e3

这将返回自UNIX纪元以来具有所需精度的毫秒数。

答案 1 :(得分:10)

在支持datetime.timestamp()方法的Python 3.3及更高版本中,您可以这样做:

from datetime import datetime, timezone, timedelta

(datetime.now(timezone.utc) + timedelta(days=3)).timestamp() * 1e3

答案 2 :(得分:5)

在POSIX时间,日始终为86400秒。要将POSIX时间戳作为一个浮点数(只有一秒)得到未来3天:

import time

DAY = 86400 # seconds
future = time.time() + 3 * DAY

它假定time.gmtime(0)是1970(POSIX Epoch)。

如果您已经有一个天真的日期时间对象来表示本地时区的时间,那么在DST转换期间时间戳可能不明确。为避免歧义,您可以使用时区感知日期时间对象或表示UTC时间的天真日期时间对象。

将本地日期时间dt转换为自纪元以来的秒数:

from datetime import datetime
from time import mktime

timestamp = dt.timestamp() # Python 3.3+
timestamp = mktime(dt.timetuple()) + dt.microsecond / 1e6 # Python 2.7

如果本地时区过去有不同的utc偏移量,并且time实现无法访问系统上的时区数据库,则可能会失败。使用pytz来处理此类案件。

将UTC日期时间utc_dt转换为POSIX时间戳:

timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()

要获得毫秒,只需将任何浮动秒数乘以1e3。

答案 3 :(得分:4)

long((time.time() + 0.5) * 1000)

这具有毫秒精度

答案 4 :(得分:1)

如果坚持使用UTC中的日期时间,您可以保留该抽象并利用timedelta:

from datetime import datetime, timedelta

epoch = datetime.utcfromtimestamp(0)

def dt_from_ms(ms):
    return datetime.utcfromtimestamp(ms / 1000.0)

def dt_to_ms(dt):
    delta = dt - epoch
    return int(delta.total_seconds() * 1000)

然后:

now = datetime.utcnow()
now
-> datetime.datetime(2017, 1, 25, 1, 30, 42, 765846)  # note microsecond precision

dt_to_ms(now)
-> 1485307842765

dt_from_ms(1485307842765)
-> datetime.datetime(2017, 1, 25, 1, 30, 42, 765000)  # note millisecond precision

then = now + timedelta(days=3)
dt_to_ms(then)
-> 1485567042765

(1485567042765 - 1485307842765) / (24*60*60*1000.0)
-> 3.0

答案 5 :(得分:0)

如果您使用的是Python 2.7或3.2+,则可以使用timedelta.total_seconds()轻松实现此目的:

import datetime, time
print time.time() + datetime.timedelta(days=3).total_seconds()

答案 6 :(得分:0)

假设有人对UTC感兴趣,以下内容在Python 3.3之后才有效:

from datetime import datetime

now = int(datetime.utcnow().timestamp()*1e3)

Python 3.3 release notes

新的datetime.datetime.timestamp()方法:返回与datetime实例相对应的POSIX时间戳。

中间结果:

In [1]: datetime.utcnow().timestamp()
Out[1]: 1582562542.407362

In [2]: datetime.utcnow().timestamp()*1e3
Out[2]: 1582562566701.329

In [3]: int(datetime.utcnow().timestamp()*1e3)
Out[3]: 1582562577296