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

Naf*_*Kay 30 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
Run Code Online (Sandbox Code Playgroud)

方法1和2给我的Unix时间,秒,毫秒不和方法3给我毫秒,没有实际精确到毫秒.

当我简单地打印时then,我得到了datetime.datetime(2011, 11, 19, 15, 16, 8, 278271),所以我知道精度可用几毫秒.如何获得具有实际毫秒精度的Unix时间戳?如果它作为一个浮动返回,我必须将它变平为一个int,这没关系.有没有我正在寻找的解决方案呢?

Ada*_*man 42

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

time.mktime(then.timetuple())*1e3 + then.microsecond/1e3
Run Code Online (Sandbox Code Playgroud)

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

  • 很好的解决方案,特别是使用`1e3`而不是1000'来节省一个字符的超级黑客. (26认同)
  • Naftuli,自1e3以来不是真的涉及3个不同的字符(1,e,3),而1000只使用2(1和0) (4认同)
  • 也许我错过了一些东西,但微秒是数百万秒而不是千分之一.另外,我不知道为什么你会乘以分数.`time.mktime(then.timetuple())+ then.microsecond/1e6`对我有用. (4认同)
  • 你错过了妙语:`print time.mktime(then.timetuple()) * 1000 + then.microsecond/1000` (2认同)

Rob*_*ire 11

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

from datetime import datetime, timezone, timedelta

(datetime.now(timezone.utc) + timedelta(days=3)).timestamp() * 1e3
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。 (2认同)

Kyr*_*Kyr 9

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

from datetime import datetime

now = int(datetime.utcnow().timestamp()*1e3)
Run Code Online (Sandbox Code Playgroud)

Python 3.3发行说明:

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

中间结果:

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
Run Code Online (Sandbox Code Playgroud)

  • 请注意:仅当本地时区为 UTC 时,这才是正确的。`datetime.utcnow()` 返回一个简单的时间戳 (!)。当对其调用方法“.timestamp()”时,假定它是本地时区 - 这会给出错误的 POSIX 时间戳。 (2认同)

jfs*_*jfs 5

86400在POSIX时间,日总是秒.要将POSIX时间戳作为浮点数获取3天(以秒为单位):

import time

DAY = 86400 # seconds
future = time.time() + 3 * DAY
Run Code Online (Sandbox Code Playgroud)

它假设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
Run Code Online (Sandbox Code Playgroud)

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

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

timestamp = (utc_dt - datetime(1970, 1, 1)).total_seconds()
Run Code Online (Sandbox Code Playgroud)

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