datetime.timestamp() 浪费时间(一小时)
datetime.timestamp() loses an time (an hour)
我遇到了这个问题,但经过一番研究后找到了解决方案。我在下面 post 编辑了我的答案以显示我的发现。如果有人有其他建议,请 post 他们。
我需要将 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
datetime.utcfromtimestamp(dt_stamp)
我们得到:
datetime.datetime(2015, 8, 7, 13, 10, 2)
比我们原来的时间早了一个小时。
对于上下文,我使用的是 Python 3,总部设在英国,我们目前使用的是英国夏令时(比 UTC 早 1 小时)。
我的解决方案可以在下面找到。如果您认为我的解释有任何遗漏或有更好的解决方案,请post您自己的回答。
我认为您需要一个所谓的感知日期时间对象。知道意味着它现在是你的时差:
datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))
尝试使用该行代码,其中 timestamp
是您的 Unix 时间戳。
造成这种差异的原因实际上显示在
datetime.timestamp documentation.
Naive datetime instances are assumed to represent local time and this method relies on the platform C mktime() function to perform the conversion. Since datetime supports wider range of values than mktime() on many platforms, this method may raise OverflowError for times far in the past or far in the future.
因为我使用的是 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 时区的人设计的。
我最近遇到了同样的问题,我的情况是英国一个hostipal的部分EDF记录有一个小时的偏差,这被认为是由于英国夏令时。
以下是我的案例的解决方案。
from datetime import datetime as dt
请使用
dt = dt.utcfromtimestamp(#YOUR_TIME_STAMP)
代替
dt = dt.fromtimestamp(#YOUR_TIME_STAMP)
我遇到了这个问题,但经过一番研究后找到了解决方案。我在下面 post 编辑了我的答案以显示我的发现。如果有人有其他建议,请 post 他们。
我需要将 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
datetime.utcfromtimestamp(dt_stamp)
我们得到:
datetime.datetime(2015, 8, 7, 13, 10, 2)
比我们原来的时间早了一个小时。
对于上下文,我使用的是 Python 3,总部设在英国,我们目前使用的是英国夏令时(比 UTC 早 1 小时)。
我的解决方案可以在下面找到。如果您认为我的解释有任何遗漏或有更好的解决方案,请post您自己的回答。
我认为您需要一个所谓的感知日期时间对象。知道意味着它现在是你的时差:
datetime.fromtimestamp(timestamp, timezone(timedelta(hours=1)))
尝试使用该行代码,其中 timestamp
是您的 Unix 时间戳。
造成这种差异的原因实际上显示在 datetime.timestamp documentation.
Naive datetime instances are assumed to represent local time and this method relies on the platform C mktime() function to perform the conversion. Since datetime supports wider range of values than mktime() on many platforms, this method may raise OverflowError for times far in the past or far in the future.
因为我使用的是 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 时区的人设计的。
我最近遇到了同样的问题,我的情况是英国一个hostipal的部分EDF记录有一个小时的偏差,这被认为是由于英国夏令时。
以下是我的案例的解决方案。
from datetime import datetime as dt
请使用
dt = dt.utcfromtimestamp(#YOUR_TIME_STAMP)
代替
dt = dt.fromtimestamp(#YOUR_TIME_STAMP)