在 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)
这种奇怪的舍入行为的原因是什么?它是故意的吗?是不是 1000000000005.0
仍然在 double 范围内,还有几位数?
最佳答案
下面我基本上包含了 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
,通过 int
向下舍入为 4999
。
Python 3 使用 divmod
返回整数 (t
) 1000000000.0
和分数 (frac
) 0.005
。
它没有返回这个,而是返回 t
作为 1000000000
和 frac
作为 0.004999995231628418
。
然后使用 frac * 1e6
计算 us
。这是将 0.004999995231628418
乘以 1000000
得到 4999.995231628418
,通过 int 四舍五入为
。4999
使用的方法并没有真正的区别。两者都是准确的,并返回相同的结果。我的结论是 Python 2 将微秒向上舍入,而 Python 3 将微秒向下舍入。
关于python - python 2 和 3 之间日期时间舍入的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28109011/