Python datetime.timestamp()会丢失一个时间(一小时)

Python datetime.timestamp()会丢失一个时间(一小时),python,python-3.x,datetime,timestamp,python-datetime,Python,Python 3.x,Datetime,Timestamp,Python Datetime,我遇到了这个问题,但经过一番研究后找到了解决办法。我已经在下面发布了我的答案,以展示我的发现。如果有人有其他建议,请张贴 我需要将datetime.datime对象转换为Unix时间戳。我尝试使用datetime.timestamp。我发现结果比我预期的晚了一个小时。我能够用以下方法复制这个问题 from datetime import datetime, timestamp dt = datetime.utcfromtimestamp(1438956602.0) from datetime

我遇到了这个问题,但经过一番研究后找到了解决办法。我已经在下面发布了我的答案,以展示我的发现。如果有人有其他建议,请张贴

我需要将
datetime.datime
对象转换为Unix时间戳。我尝试使用datetime.timestamp。我发现结果比我预期的晚了一个小时。我能够用以下方法复制这个问题

from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)
from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)
dt_stamp = datetime.timestamp(dt.replace(tzinfo=timezone.utc))
dt现在等于datetime.datetime(2015,8,7,14,10,2)

然后:

它给出了
dt_stamp=1438953002.0
(与我们原来的时间戳不同)。如果我们把它转换回datetime

datetime.utcfromtimestamp(dt_stamp)
我们得到:

datetime.datetime(2015, 8, 7, 13, 10, 2)
比我们原来的时间早了一个小时

在上下文中,我使用的是Python 3,总部位于英国,我们目前使用的是英国夏季时间(比UTC提前1小时)


我的解决方案可以在下面找到。如果您认为我的解释遗漏了什么,或者有更好的解决方案,请发布您自己的答案。

我认为您需要一个所谓的aware datetime对象。Aware表示您现在有时差:

datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))

用这行代码试试看,其中
时间戳
是您的Unix时间戳。

造成这种差异的原因实际上显示在

假定Naive datetime实例表示本地时间,此方法依赖于平台C mktime()函数来执行转换。由于在许多平台上,datetime支持比mktime()更广泛的值范围,因此此方法可能会在过去或将来的很长时间内引发溢出错误

因为我在UTC+1(英国夏季时间),所以这是时区
datetime。timestamp
用于计算时间戳。这就是错误所在。本文档推荐了几种处理此问题的方法。我同意以下观点

from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)
from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)
dt_stamp = datetime.timestamp(dt.replace(tzinfo=timezone.utc))
通过将
.replace(tzinfo=timezone.utc)
添加到
dt
的末尾,它指定在utc时区执行此操作<代码>日期时间。时间戳
然后知道使用UTC时间,而不是我的机器运行的任何时区


如果不使用UTC时区,美国或世界其他地区的人将遇到此问题。如果是这种情况,您可以将
tzinfo
设置为您所在的时区。还要注意的是,
datetime.utcfromtimestamp
也是为使用UTC时区的人设计的。

我最近遇到了同样的问题,我的情况是,英国一家主机的部分EDF记录有一个小时的偏差,这是由于英国的夏季时间
以下是我的案例的解决方案

from datetime import datetime as dt
请使用

dt = dt.utcfromtimestamp(#YOUR_TIME_STAMP)
而不是

dt = dt.fromtimestamp(#YOUR_TIME_STAMP)

正如python文档中所述,naive datetime的计算基于本地时间。由于您当前正在使用BST,因此这将是任何处理的基础。因此,相差1小时。供参考: