我遇到了这个问题但经过一些研究后找到了解决方案。我在下面发布了我的答案,以显示我的发现。如果有人有其他建议,请发布。
我需要将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小时)。
我的解决方案可以在下面找到。如果您认为我错过了我的解释或有更好的解决方案,请发表您自己的答案。
我认为你需要一个所谓的知道日期时间对象。意识到它意味着你拥有的时差:
datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))
尝试使用那行代码,其中timestamp
是你的Unix时间戳。
造成这种差异的原因实际上是在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时区的人设计的。