Python 使用时间戳和使用时间增量的时间相加之间的差异?

Python 使用时间戳和使用时间增量的时间相加之间的差异?,python,datetime,timedelta,Python,Datetime,Timedelta,我正在处理Exercism.io千兆秒问题: “计算某人已活10^9秒的时间。” 我的方法是将datetime输入转换为时间戳,添加10**9,然后再转换回。我的答案非常接近,但是测试套件(由Exercism提供)失败了,因为hour arg关闭了1。所有其他参数都是正确的 经过一点搜索,我找到了一个使用timedelta的答案;答案的结构与我的几乎相同,但它生成了完全正确的答案 我的问题是,为什么这两种方法的输出有差异?正如您在下面看到的,只有当小时的输入参数为默认值0时,问题才会出现 代码:

我正在处理Exercism.io千兆秒问题:

“计算某人已活10^9秒的时间。”

我的方法是将datetime输入转换为时间戳,添加10**9,然后再转换回。我的答案非常接近,但是测试套件(由Exercism提供)失败了,因为hour arg关闭了1。所有其他参数都是正确的

经过一点搜索,我找到了一个使用timedelta的答案;答案的结构与我的几乎相同,但它生成了完全正确的答案

我的问题是,为什么这两种方法的输出有差异?正如您在下面看到的,只有当小时的输入参数为默认值0时,问题才会出现

代码:

投入:

tests = [datetime(2011, 4, 25),
         datetime(1977, 6, 13),
         datetime(1959, 7, 19),
         datetime(2015, 1, 24, 22, 0, 0),
         datetime(2015, 1, 24, 23, 59, 59),]
结果:

test 1
datetime.datetime(2043, 1, 1, 0, 46, 40)
datetime.datetime(2043, 1, 1, 1, 46, 40)

test 2
datetime.datetime(2009, 2, 19, 0, 46, 40)
datetime.datetime(2009, 2, 19, 1, 46, 40)

test 3
datetime.datetime(1991, 3, 27, 0, 46, 40)
datetime.datetime(1991, 3, 27, 1, 46, 40)

test 4
datetime.datetime(2046, 10, 2, 23, 46, 40)
datetime.datetime(2046, 10, 2, 23, 46, 40)

test 5
datetime.datetime(2046, 10, 3, 1, 46, 39)
datetime.datetime(2046, 10, 3, 1, 46, 39)

如您所见,对于指定了年、月、日期的所有输入,每个测试中的顶部答案(使用时间戳)都被关闭1。当输入中包含小时、分钟、秒和微秒参数时,将获得正确答案。

这很可能是由时区问题引起的。我怀疑当您转换为时间戳并返回到日期时间时,时区信息会丢失。

夏令时

一些侦探工作可以揭示这些问题。对于这次调查,我选择了你名单上的第一个日期,2011年4月25日

from datetime import datetime, timedelta

def add_seconds(birth_date, n):
    x = datetime.fromtimestamp(birth_date.timestamp() + n)
    y = birth_date + timedelta(seconds=n)
    return (x, y)

for i in range(365):
    ts, td = add_seconds(datetime(2011, 4, 25), i*60**2*24)  # add i days via seconds
    if ts-td:  # test for difference in timestamp vs timedelta methods
        print(i, ts, td)
        break
结果:

189 2011-10-30 23:00:00 2011-10-31 00:00:00
正如你所看到的,10月30日正好有一个差异。这是一年中我们看到夏时制调整的第二天


更新:这里提出了一个类似的问题:。造成这种差异的根本原因是
datetime.timedelta
没有考虑DST,而
timestamp
则考虑了这一点。

夏令时可能与此有关;请注意,您的最后两个没有关闭。
189 2011-10-30 23:00:00 2011-10-31 00:00:00