为什么 datetime.datetime.now() - datetime.datetime.now() 等于 datetime.timedelta(-1, 86399, 999974)?

Why does datetime.datetime.now() - datetime.datetime.now() equal to datetime.timedelta(-1, 86399, 999974)?

考虑以下片段:

import datetime
print(datetime.datetime.now() - datetime.datetime.now())

在我的 Python 2.7.8 x86_64 Linux 下,我得到 -1 day, 23:59:59.999940。为什么会这样?

查看 datetime.timedelta 文档:

Note that normalization of negative values may be surprising at first. For example,

>>> from datetime import timedelta
>>> d = timedelta(microseconds=-1)
>>> (d.days, d.seconds, d.microseconds) (-1, 86399, 999999)

你有一个负的 timedelta,标准化总是使用 正数 秒和微秒。

要存储负增量,那么只有 .days 属性可以存储负值,您最终会得到 -1 天加上正数秒和微秒:

>>> import datetime
>>> td = datetime.datetime.now() - datetime.datetime.now()
>>> print(td)
-1 day, 23:59:59.999988
>>> td
datetime.timedelta(-1, 86399, 999988)
>>> td.days
-1
>>> td.seconds
86399
>>> td.microseconds
999988
>>> (24 * 60 * 60)  # 1 day in seconds
86400
>>> (24 * 60 * 60) - td.seconds
1
>>> 1000000 - td.microseconds
12

因此 timedelta 确实代表 -12 微秒,但相对于 -1 天表示为 +86399 秒和 +999988 微秒。