如何在Python中根据本地日历计算一天的实际工作时间?

3
我想编写一个小函数,可以计算任何时区的任何给定日期的小时数。显然的方法是计算一天中第一个瞬间和第二天之间的小时数。不幸的是,无论我选择哪一天,这种方法总是认为一天有24个小时。
英国,时钟在3月的凌晨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 

有没有更简单的方法来获取特定日期中的小时数,以便得到正确的答案?

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


这需要处理仅夏令时更改,还是包括“闰秒”?我不知道是否有其他正在使用的时钟更改。 - Prune
是的,我已经将这个作为问题的澄清添加了进去。谢谢。 - Salim Fadhley
这是一个很好的问题。闰年日期是按照ISO标准确定的。闰秒是通过ISO由科学界协商决定的。夏令时由当地权威机构(国家、省份、州)控制。我不知道有没有方便的资源可以获取给定位置的所有这些变化。未来的闰秒有点不稳定。 - Prune
1个回答

1

问题的一部分“使用标准日期时间构造函数的tzinfo参数,对于许多时区与pytz不兼容”

所以我们可以通过使用{{link2: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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接