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)
我正在尝试获取在设定的当地时间范围内的时区列表。例如。上午 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)