datetime.timestamp()丢失时间(一小时)

问题描述 投票:-2回答:2

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

我需要将datetime.datime对象转换为Unix时间戳。我尝试使用datetime.timestamp。我发现结果比我的预期落后1小时。我能够通过以下方式复制此问题。

from datetime import datetime, timestamp
dt = datetime.utcfromtimestamp(1438956602.0)

dt现在等于datetime.datetime(2015, 8, 7, 14, 10, 2)

然后:

dt_stamp = datetime.timestamp(dt)

这给了dt_stamp = 1438953002.0(与我们原来的时间戳不同)。如果我们将它转​​换回日期时间

datetime.utcfromtimestamp(dt_stamp)

我们得到:

datetime.datetime(2015, 8, 7, 13, 10, 2)

比我们原来的时间早一个小时。

对于上下文我使用的是Python 3并且位于英国,我们目前正在使用英国夏令时(比UTC早1小时)。

我的解决方案可以在下面找到。如果您认为我错过了我的解释或有更好的解决方案,请发表您自己的答案。

python python-3.x datetime timestamp python-datetime
2个回答
0
投票

我认为你需要一个所谓的知道日期时间对象。意识到它意味着你拥有的时差:

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

尝试使用那行代码,其中timestamp是你的Unix时间戳。


0
投票

造成这种差异的原因实际上是在datetime.timestamp documentation中显示的。

假定天真的日期时间实例表示本地时间,并且此方法依赖于平台C mktime()函数来执行转换。由于datetime在许多平台上支持比mktime()更宽范围的值,因此该方法可能会在过去或将来远的时候引发OverflowError。

因为我在UTC + 1(在英国夏季时间),这是datetime.timestamp用于计算时间戳的时区。这就是错误的来源。文档建议了几种方法来解决这个问题。我跟着以下。

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时区中完成的。然后datetime.timestamp知道使用UTC时间而不是我的机器正在运行的任何时区。

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

© www.soinside.com 2019 - 2024. All rights reserved.