在python 2中,我们有:
>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0)
datetime.datetime(2001, 9, 9, 1, 46, 40, 5000)
但是在python 3中,我们有:
>>> datetime.datetime.utcfromtimestamp(1000000000005.0/1000.0)
datetime.datetime(2001, 9, 9, 1, 46, 40, 4999)
这种奇怪的舍入行为的原因是什么? Isn&#t; t 1000000000005.0
仍然在双打范围内,只有几位数?
答案 0 :(得分:1)
下面我基本上包括了utcfromtimestamp
(我稍微修改了一下)。
在Python 2中:
import time, datetime
def utcfromtimestamp(t):
y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t)
us = int((t % 1.0) * 1000000)
ss = min(ss, 59)
return datetime.datetime(y, m, d, hh, mm, ss, us)
在Python 3中:
import time, datetime
def utcfromtimestamp(t):
t, frac = divmod(t, 1.0)
us = int(frac * 1e6)
if us == 1000000:
t += 1
us = 0
y, m, d, hh, mm, ss, weekday, jday, dst = time.gmtime(t)
ss = min(ss, 59)
return datetime.datetime(y, m, d, hh, mm, ss, us)
(输入1000000000005.0/1000.0
计算为1000000000.005
。)
在我的独立版本中:
Python 2使用模数运算符%
来确定输入是整数还是分数。
声明(t % 1.0) * 1000000
然后将分数(在我们的情况下为0.004999995231628418
)乘以1000000
。这会返回4999.995231628418
,4999
向下舍入到int
。
Python 3使用divmod
返回整数(t
)1000000000.0
和分数(frac
)0.005
。
它不会返回此内容,而是将t
作为1000000000
返回,将frac
作为0.004999995231628418
返回。
然后使用us
计算frac * 1e6
。这会将0.004999995231628418
乘以1000000
,从而生成4999.995231628418
,4999
向下舍入到int
。
使用的方法没有真正的区别。两者都是准确的并返回相同的结果。我的结论是Python 2将微秒向上舍入,而Python 3则将它们四舍五入。