我遇到了这个问题,但经过一些研究后找到了解决方案。我在下面发布了我的答案以显示我的发现。如果有人有其他建议,请发布。
我需要将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小时)。
我的解决方案可以在下面找到。如果您认为我的解释中没有任何内容,或者有更好的解决方案,请发表您自己的答案。
答案 0 :(得分:0)
我认为您需要一个所谓的感知日期时间对象。意识到意味着现在有了您的时差:
datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))
尝试使用该行代码,其中timestamp
是您的Unix时间戳。
答案 1 :(得分:0)
造成这种差异的原因实际上显示在 datetime.timestamp documentation。
假定朴素的datetime实例表示本地时间,并且此方法依赖于平台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时区的人们设计的。
答案 2 :(得分:0)
我最近遇到了一个同样的问题,我的情况是,来自英国一位女招待的部分EDF录音有一个小时的偏差,这被认为是由于英国的夏季时间。
以下是我的情况的解决方案。
from datetime import datetime as dt
请使用
dt = dt.utcfromtimestamp(#YOUR_TIME_STAMP)
代替
dt = dt.fromtimestamp(#YOUR_TIME_STAMP)