我正在尝试做一些非常简单的事情,将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纪元以来具有所需精度的毫秒数.
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)
假设有人对 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)
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即可.