我正在尝试做一些非常简单的事情,将未来三天的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
,那很好。有没有我正在寻找的解决方案呢?
答案 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