pytz:获取所有时区,现在是在特定时间范围之间

pytz: getting all timezones, where now is between a specific range of times

我正在尝试获取在设定的当地时间范围内的时区列表。例如。上午 9 点到下午 2 点之间。

根据 this 问题,可以获取特定时间的时区,例如早上 9 点,但我想要一个范围。

除了像下面这样每小时都这样做,有没有更好的方法来完成这个?

from datetime import datetime
import pytz

now = datetime.now(pytz.utc)
[tz for tz in pytz.common_timezones_set if now.astimezone(pytz.timezone(tz)).hour == 9]
[tz for tz in pytz.common_timezones_set if now.astimezone(pytz.timezone(tz)).hour == 10]
[tz for tz in pytz.common_timezones_set if now.astimezone(pytz.timezone(tz)).hour == 11]
...

conditional expression used in the if clause of a list comprehension(在链接问题的答案中使用)可以根据需要复杂化,如下所示。

注意我还修改了时间比较的完成方式,因此它不再忽略转换值的分钟、秒和微秒,假设时间变化差异始终以整小时为单位。虽然这通常是正确的,但我至少知道有几个例外(将来可能会有更多)。

另请注意,时间间隔本身并不限于小时数——因此例如也可以检查 begin, end = time(hour=9, minute=0), time(hour=9, minute=30) 的时间范围。

from datetime import datetime, time
from pprint import pprint
import pytz

def datetime_to_time(dt, tz):
    """Convert datetime dt to timezone tz and return its local time of day."""
    ndt = dt.astimezone(pytz.timezone(tz))
    return time(hour=ndt.hour, minute=ndt.minute, second=ndt.second,
                microsecond=ndt.microsecond)

begin, end = time(hour=9), time(hour=10)  # Time range.
now = datetime.now(pytz.utc)
in_time_range = [tz for tz in pytz.common_timezones_set if
                        begin <= datetime_to_time(now, tz) <= end]

print('in_time_range:')
pprint(in_time_range)