python - 如何根据 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
有没有更简单的方法来获取特定日期的小时数,并给出正确的答案?
理想情况下,这应该能够考虑夏令时、闰年甚至闰秒。
解决方案
部分问题是“在许多时区使用标准日期时间构造函数的 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