提问人:simonzack 提问时间:1/23/2015 最后编辑:simonzack 更新时间:1/27/2015 访问量:224
python 2 和 3 之间日期时间舍入的奇怪行为
Strange behavior of datetime rounding between python 2 & 3
问:
在 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
答:
0赞
Zach Gates
1/27/2015
#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 用于返回整数 () 和分数 ()。
它不是返回这个,而是返回 和 as 。
然后,它开始使用 进行计算。这是将 ur 乘以 得到 ,四舍五入为 。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 正在向下舍入它们。
评论
datetime_from_timestamp()
中的_PyTime_ROUND_DOWN
吗?在此处将其更改为生产。_PyTime_ROUND_UP
5000