Python 从日期时间获取总秒数导致偶尔出错

Python get total seconds from datetime results in occasional mistakes

我正在尝试按照 these answers 获取数组中每个元素自 1970 年 1 月 1 日以来经过的秒数 (my_times)。然后我使用这些值来查找每个连续时间之间的时间间隔。我采取的任何一种方法似乎至少有两次给出了错误的答案。

马克拜尔斯回答

要获取自 1970 年 1 月 1 日以来的秒数,他建议尝试:

time.mktime(my_time.timetuple())

然而,这似乎不适用于时间 "2017-11-05 01:46:00+00""2017-11-05 01:47:00+00"

当我 运行 下面的代码时,它表示值之间的间隔是 3660.0 秒而不是 60.0 秒

from datetime import datetime
import time

my_time1 = datetime.strptime("2017-11-05 01:46:00+00", "%Y-%m-%d %H:%M:%S+%f")
my_time2 = datetime.strptime("2017-11-05 01:47:00+00", "%Y-%m-%d %H:%M:%S+%f")
time.mktime(my_time2.timetuple()) - time.mktime(my_time1.timetuple())

Andrzej Pronobis 的回答

要获取自 1970 年 1 月 1 日以来的秒数,他建议尝试:

my_time.timestamp()

这修复了较早的两个时间,但它不再适用于时间 "2017-11-05 01:59:00+00""2017-11-05 02:00:00+00"。出现同样的问题,我得到 3660.0 秒而不是 60.0 秒

from datetime import datetime

my_time1 = datetime.strptime("2017-11-05 01:59:00+00", "%Y-%m-%d %H:%M:%S+%f")
my_time2 = datetime.strptime("2017-11-05 02:00:00+00", "%Y-%m-%d %H:%M:%S+%f")
my_time2.timestamp() - my_time1.timestamp()

我想知道我做错了什么吗?当日期时间作为字符串给出时,还有更好的方法来查找所有连续的时间间隔吗?


编辑:

谢谢约翰,解决了这个问题。奇怪的是,将格式从 +%f 更改为 %z 仍然 运行 进入同一问题。

起作用的是 运行ning sudo ln -sf /usr/share/zoneinfo/UTC /etc/localtime(将我的计算机时间更改为 UTC),然后一直进行评估

这里是"garbage in, garbage out."的案例:

datetime.strptime("2017-11-05 01:59:00+00", "%Y-%m-%d %H:%M:%S+%f")

您可能认为最后的 +00 表示 "UTC time",但 %f 格式说明符表示 "fractional seconds."

在任何情况下,您显然 运行 在时区设置为夏令时部分时间的系统上。凌晨 2 点在 11 月的 DST 转换日期发生两次,因此您的代码按编写的方式工作(基本上是模棱两可的)。

换句话说:您的问题不是您计算时间增量不正确。您的问题是您错误地(或模棱两可地)从字符串加载时间。