datetime.timestamp()浪费时间(一个小时)

时间:2018-09-12 13:39:19

标签: python python-3.x datetime timestamp python-datetime

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

我需要将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小时)。

我的解决方案可以在下面找到。如果您认为我的解释中没有任何内容,或者有更好的解决方案,请发表您自己的答案。

3 个答案:

答案 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)