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 转换日期发生两次,因此您的代码按编写的方式工作(基本上是模棱两可的)。
换句话说:您的问题不是您计算时间增量不正确。您的问题是您错误地(或模棱两可地)从字符串加载时间。
我正在尝试按照 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 转换日期发生两次,因此您的代码按编写的方式工作(基本上是模棱两可的)。
换句话说:您的问题不是您计算时间增量不正确。您的问题是您错误地(或模棱两可地)从字符串加载时间。