python pytz检查时间是不是在悉尼/墨尔本时间而不是UTC之间

Posted

技术标签:

【中文标题】python pytz检查时间是不是在悉尼/墨尔本时间而不是UTC之间【英文标题】:python pytz check if time is between on sydney/melbourne time not utcpython pytz检查时间是否在悉尼/墨尔本时间而不是UTC之间 【发布时间】:2021-06-20 00:31:43 【问题描述】:

我有这张支票

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

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

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

【问题讨论】:

查看您的导入。使用datetime.now(tz) 啊,是的,我曾经尝试过,它导致了这个错误'&gt;=' not supported between instances of 'datetime.datetime' and 'datetime.time' question updated* 确保您没有将苹果与梨进行比较 - 因此在比较中仅使用 datetime.datetime 对象或 datetime.time 对象,而不是混合使用。请注意,这与 pytz 或 UTC(时区)没有直接关系。 @MrFuppes 我也试过了,但得到了那个错误。问题已更新*我想知道传递的正确内容是什么。 旁注:使用 Python 3.9,您可以使用 zoneinfo,这在某些方面比 pytz 更方便 - example。 【参考方案1】:

在进行比较之前将您的时间输入转换为日期。还要注意让他们知道时区。我已经调整了您的方法,这可以正常工作并返回澳大利亚/悉尼当前当地时间的正确结果:

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 测试)

【讨论】:

哦,是的,这可能是比我的解决方案更好的方法,更快,更有说服力。谢谢 是的,我会坚持使用datetime 比较,而不是进行字符串比较。如果有用,请随时 accept and upvote 回答。 如果您只想比较时间,为什么还要添加日期?旁注#1:我认为像这样设置一个 pytz tz 对象会给你一个错误的 UTC 偏移量(虽然在这里应该无关紧要)。旁注#2:您可以在对datetime.combine 的调用中使用now.date()【参考方案2】:

我发现如果你使用这个 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)

【讨论】:

这里不需要 strftime。只需使用datetime_Aus.time() 仅比较时间对象,例如check_time = datetime.now(tz_Aus).time()

以上是关于python pytz检查时间是不是在悉尼/墨尔本时间而不是UTC之间的主要内容,如果未能解决你的问题,请参考以下文章

Google 地图 API 中的颜色变化折线属性

国内hr认可悉尼大学吗

悉尼大学的学院介绍

Ruby带你澳洲游

澳大利亚读会计与金融专业哪个大学好

python(pytz)中的奇怪时区行为