python pytz 检查时间是否在 sydney/melbourne 时间之间而不是 utc

python pytz check if time is between on sydney/melbourne time not utc

我有这张支票

if is_time_between(time(6,59,45), time(18,10)):

我想看看现在的时间是不是在我传入的两次之间,我觉得差不多了。

#from datetime import timezone, datetime, timedelta
from datetime import datetime, time
#import time
import pytz
import dateutil.parser
#from pytz import timezone
    
def is_time_between(begin_time, end_time):
            tz = pytz.timezone('Australia/Sydney')
            check_time = datetime.time(tz)
            if begin_time < end_time:
                return check_time >= begin_time and check_time <= end_time
            else: # crosses midnight
                return check_time >= begin_time or check_time <= end_time

我在使用 imports 和 froms 时遇到了多个错误,但当前错误是:

descriptor 'time' requires a 'datetime.datetime' object but received a 'Australia/Sydney'

我发现如果你使用这个 strftime() 你可以使用 pytz 进行转换,虽然你必须使你正在检查的东西也成为字符串以便它可以比较,否则你正在比较 str 和 datetime.time,这是一个错误

def is_time_between(begin_time, end_time, check_time=None):
    # If check time is not given, default to current UTC time
    tz_Aus = pytz.timezone('Australia/Sydney')
    datetime_Aus = datetime.now(tz_Aus)
    check_time = datetime_Aus.strftime("%H:%M:%S")
    if begin_time < end_time:
        return str(check_time) >= str(begin_time) and str(check_time) <= str(end_time)
    else: # crosses midnight
        return str(check_time) >= str(begin_time) or str(check_time) <= str(end_time)

在进行比较之前,将您输入的时间转换为日期。还要注意让他们知道时区。我已经调整了你的方法,这有效并且 returns 在 Australia/Sydney:

当前本地时间的正确结果
from datetime import datetime, date, time
import pytz


def is_time_between(begin_time, end_time):
    tz = pytz.timezone('Australia/Sydney')
    now = datetime.now(tz)
    begin_date = datetime.combine(date(now.year, now.month, now.day), begin_time, tzinfo=now.tzinfo)
    end_date = datetime.combine(date(now.year, now.month, now.day), end_time, tzinfo=now.tzinfo)
    if begin_time < end_time:
        return now >= begin_date and now <= end_date
    else:  # crosses midnight
        return now >= begin_date or now <= end_date


print(is_time_between(time(6, 59, 45), time(18, 10)))
print(is_time_between(time(22, 00), time(23, 00)))
print(is_time_between(time(21, 00), time(7, 00)))
print(is_time_between(time(23, 30), time(7, 00)))

输出:

False
True
True
False

(使用 Python 3.8.0 测试)