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)
啊,是的,我曾经尝试过,它导致了这个错误'>=' 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之间的主要内容,如果未能解决你的问题,请参考以下文章