python - python 2 和 3 之间日期时间舍入的奇怪行为

标签 python datetime rounding

在 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 作为 1000000000frac 作为 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/

相关文章:

python - 如何在 5 上四舍五入

Python subprocess.run 与 stderr=subprocess.PIPE 重定向输入(文本)

python - 使用已知函数 numpy 进行曲线拟合

c++ - C++:将unix时间戳记为UTC月份

c++ - 从 url 读取 xml 行

javascript - Firefox 在 Windows 上不读取本地时间

python 回合问题

java - 数组舍入

python - 将 Pandas DataFrame 转换为嵌套元组列表的快速方法

python - RegEx:获取多个字符串python