Python 现在日期时间与现在日期时间的差异
Python difference in datetime now against datetime now
我遇到了问题,或者很可能轮到我了!不确定,想知道!在 python 的日期时间库中,获取时间差,如下面的代码片段所示。
>>> import datetime
>>> datetime.datetime.now() - datetime.datetime.now()
datetime.timedelta(-1, 86399, 999958)
>>> tnow = datetime.datetime.now()
>>> datetime.datetime.now() - tnow
datetime.timedelta(0, 4, 327859)
我想了解为什么 datetime.datetime.now() - datetime.datetime.now()
产生的输出为 -1 天,86399 秒,而将当前时间分配给某个变量并计算差异会得到所需的输出 0天4秒.
结果似乎有点混乱,如果有人能破解背后的原因会很有帮助
注意:我使用的是 Python 2.7
的文档
If the normalized value of days lies outside the indicated range,
OverflowError is raised.
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)
这对 python 2.7 和 3 都有效。
发生这种情况的原因很简单:
a , b = datetime.datetime.now(), datetime.datetime.now()
# here datetime.now() in a will be <= b.
# That is because they will be executed separately at different CPU clock cycle.
a - b
# datetime.timedelta(-1, 86399, 999973)
b - a
# datetime.timedelta(0, 0, 27)
获取正确的时差:
(tnow - datetime.datetime.now()).total_seconds()
# output: -1.751166
此答案提供了有关如何安全使用时间增量(处理负值)的更多信息Link
您遇到了 "corner case" 情况。
- 每个
datetime.datetime.now()
都会生成一个 datetime.datetime
对象 ([Python]: https://docs.python.org/3/library/datetime.html#datetime-objects),它是当前日期和时间 此时 调用是制作
- 您有 2 个这样的电话(即使他们在同一条线上)。由于现在 CPU 速度非常快,因此每次这样的调用都需要很短的时间(我想比微秒少得多)
- 但是,当第 1st 次调用处于(微秒?)周期的末尾时,第 2nd 次调用在下一个的开头,你会得到这个行为:
>>> import datetime
>>> now0 = datetime.datetime.now()
>>> now0
datetime.datetime(2018, 2, 20, 12, 23, 23, 1000)
>>> delta = datetime.timedelta(microseconds=1)
>>> now1 = now0 + delta
>>> now0 - now1
datetime.timedelta(-1, 86399, 999999)
解释:
- 让
now0
成为对 datetime.datetime.now()
的第 1st 次调用的结果
- 假设 2nd
datetime.datetime.now()
调用在一微秒后发生(我正在使用 delta
对象重现该行为,因为所涉及的时间这里太小了,我无法在遇到此行为时 确切 时间 运行 该行)。即放入 now1
- 当减去它们时你得到负值(在我的例子中是
-delta
),因为 now0
发生在 now1
之前(查看 [Python]: timedelta Objects 了解更多细节)
我遇到了问题,或者很可能轮到我了!不确定,想知道!在 python 的日期时间库中,获取时间差,如下面的代码片段所示。
>>> import datetime
>>> datetime.datetime.now() - datetime.datetime.now()
datetime.timedelta(-1, 86399, 999958)
>>> tnow = datetime.datetime.now()
>>> datetime.datetime.now() - tnow
datetime.timedelta(0, 4, 327859)
我想了解为什么 datetime.datetime.now() - datetime.datetime.now()
产生的输出为 -1 天,86399 秒,而将当前时间分配给某个变量并计算差异会得到所需的输出 0天4秒.
结果似乎有点混乱,如果有人能破解背后的原因会很有帮助
注意:我使用的是 Python 2.7
If the normalized value of days lies outside the indicated range, OverflowError is raised.
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)
这对 python 2.7 和 3 都有效。
发生这种情况的原因很简单:
a , b = datetime.datetime.now(), datetime.datetime.now()
# here datetime.now() in a will be <= b.
# That is because they will be executed separately at different CPU clock cycle.
a - b
# datetime.timedelta(-1, 86399, 999973)
b - a
# datetime.timedelta(0, 0, 27)
获取正确的时差:
(tnow - datetime.datetime.now()).total_seconds()
# output: -1.751166
此答案提供了有关如何安全使用时间增量(处理负值)的更多信息Link
您遇到了 "corner case" 情况。
- 每个
datetime.datetime.now()
都会生成一个datetime.datetime
对象 ([Python]: https://docs.python.org/3/library/datetime.html#datetime-objects),它是当前日期和时间 此时 调用是制作 - 您有 2 个这样的电话(即使他们在同一条线上)。由于现在 CPU 速度非常快,因此每次这样的调用都需要很短的时间(我想比微秒少得多)
- 但是,当第 1st 次调用处于(微秒?)周期的末尾时,第 2nd 次调用在下一个的开头,你会得到这个行为:
>>> import datetime >>> now0 = datetime.datetime.now() >>> now0 datetime.datetime(2018, 2, 20, 12, 23, 23, 1000) >>> delta = datetime.timedelta(microseconds=1) >>> now1 = now0 + delta >>> now0 - now1 datetime.timedelta(-1, 86399, 999999)
解释:
- 让
now0
成为对datetime.datetime.now()
的第 1st 次调用的结果
- 假设 2nd
datetime.datetime.now()
调用在一微秒后发生(我正在使用delta
对象重现该行为,因为所涉及的时间这里太小了,我无法在遇到此行为时 确切 时间 运行 该行)。即放入now1
- 当减去它们时你得到负值(在我的例子中是
-delta
),因为now0
发生在now1
之前(查看 [Python]: timedelta Objects 了解更多细节)