首页 > 解决方案 > 如何根据 Python 中的本地日历计算一天中的实际小时数?

问题描述

我想编写一个小函数,可以计算任何给定日期、任何时区的小时数。显而易见的方法是计算一天的第一时刻和第二天之间的小时数。不幸的是,无论我选择哪一天,这种方法总是说一天是 24 小时。

英国,时钟在三月的凌晨 1 点提前了 1 小时。这意味着 2021 年 3 月 28 日应该有 23 小时。当天凌晨 1 点到 2 点的时间范围将不存在。

同样,在 2021 年 10 月 31 日,时钟在凌晨 1 点被推迟,因此这一天将有 ​​25 个小时。午夜到凌晨 1 点的时间范围将在当天发生两次。

import datetime
import pytz

# When do the clocks change?
# https://www.gov.uk/when-do-the-clocks-change

day0=datetime.datetime(2021,3,28, tzinfo=pytz.timezone("Europe/London"))
day1=datetime.datetime(2021,3,29, tzinfo=pytz.timezone("Europe/London"))

delta = day1-day0

print(delta)
hours = delta / datetime.timedelta(hours=1)
print(hours)

此脚本给出的输出似乎不正确:

1 day, 0:00:00
24.0 

有没有更简单的方法来获取特定日期的小时数,并给出正确的答案?

理想情况下,这应该能够考虑夏令时、闰年甚至闰秒。

标签: pythontimecalendar

解决方案


部分问题“在许多时区使用标准日期时间构造函数的 tzinfo 参数对 pytz ''不起作用''。”

所以我们可以通过使用timezone.localize()当地的幼稚时间(没有 tz)来解决这个问题:

London = pytz.timezone("Europe/London")

day0 = London.localize(datetime.datetime(2021,3,28))
day1 = London.localize(datetime.datetime(2021,3,29))

(day1  - day0).total_seconds() / 60 / 60  # in hours
# 23.0

10 月 31 日:

day0 = London.localize(datetime.datetime(2021, 10, 31))
day1 = London.localize(datetime.datetime(2021, 11, 1))
(day1  - day0).total_seconds() / 60 / 60
# 25.0

推荐阅读