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

Posted

技术标签:

【中文标题】pytz:获取所有时区,现在在特定时间范围之间【英文标题】:pytz: getting all timezones, where now is between a specific range of times 【发布时间】:2022-01-09 05:05:06 【问题描述】:

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

【问题讨论】:

你能用不等式吗?例如(now.astimezone(pytz.timezone(tz)).hour >= 9) and (now.astimezone(pytz.timezone(tz)).hour <= 11)? 【参考方案1】:

list comprehension 的if 子句中使用的conditional expression(在链接问题的答案中使用)可以根据需要尽可能复杂,如下所示。

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

还要注意,时间间隔本身并不限于整数小时 - 例如,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)

【讨论】:

以上是关于pytz:获取所有时区,现在在特定时间范围之间的主要内容,如果未能解决你的问题,请参考以下文章

pytz 时区的 STD 偏移量

使用 pytz 进行日期时间时区转换

如何获取 pytz 时区的通用名称,例如。美国/纽约的 EST/EDT

如何使用 pytz 从时区字符串中获取 UTC 偏移量?

使用pytz的Datetime时区转换

pytz:为啥在时区之间转换时需要规范化?