如何根据 Python 中的本地日历计算一天中的实际小时数?
How do I calculate the actual number of hours in a day according to a local calendar in Python?
我想编写一个小函数来计算任何给定日期、任何时区的小时数。显而易见的方法是计算一天中第一刻和第二天之间的小时数。不幸的是,无论我选择哪一天,这种方法总是说一天是 24 小时。
在UK, the clocks are advanced at 1am in March by 1 hour。这意味着 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
是否有更简单的方法来获取特定日期的小时数并给出正确答案?
理想情况下,这应该能够考虑夏令时、闰年甚至闰秒。
Part of the issue 是 “使用标准日期时间构造函数的 tzinfo 参数对于许多时区来说‘‘不起作用’’。”
所以我们可以通过使用 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
我想编写一个小函数来计算任何给定日期、任何时区的小时数。显而易见的方法是计算一天中第一刻和第二天之间的小时数。不幸的是,无论我选择哪一天,这种方法总是说一天是 24 小时。
在UK, the clocks are advanced at 1am in March by 1 hour。这意味着 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
是否有更简单的方法来获取特定日期的小时数并给出正确答案?
理想情况下,这应该能够考虑夏令时、闰年甚至闰秒。
Part of the issue 是 “使用标准日期时间构造函数的 tzinfo 参数对于许多时区来说‘‘不起作用’’。”
所以我们可以通过使用 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