python - Python - 虽然循环不适用于时间
问题描述
我有一个启动main 函数的代码。在这个函数中有一个while loop
在特定时间到来时应该启动程序。我已经在 morning
(开始时间)、evening
(结束时间)变量中设置了这个时间。它在while循环中并且可以工作,但前提是我在我想使用它的那天启动程序。例如:当我星期一晚上(20:00)开始并且start
时间(morning
变量)是从 8:00(第二天)开始时,它将继续循环
print("等待合适的时间") <=(这样做)
就算第二天到了那个时候。但是当我第二天在 6:00 左右开始它时它会起作用......
有人可以解释一下,为什么会这样?这是代码
import datetime
from time import sleep
from datetime import date
#variables
now = datetime.datetime.now()
morning = now.replace(hour=8, minute=0, second=0, microsecond=0)
evening = now.replace(hour=16, minute=15, second=0, microsecond=0)
#function for time-setting
def time_in_range(morning, evening, x):
if morning <= evening:
return morning <= x <= evening
else:
return morning <= x or x <= evening
timerange = time_in_range(morning, evening, now)
#main function
def main():
while True:
# Time period check
if date.today().weekday() < 5 and date.today().weekday() >= 0:
dayz = True
else:
dayz = False
if dayz != True:
print("Waiting for the day")
sleep(3600)
continue
now = datetime.datetime.now()
timerange = time_in_range(morning, evening, now)
if timerange != True: # HERE IT MAKES THE TROUBLE
print("Waiting for the right time")
sleep(200)
continue
print("do something")
main()
print("end of code")
解决方案
当您调用.replace()
设置morning
和evening
时间时,它会将当前日期保留为datetime
对象的一部分。因此,如果您在前一天调用它,则日期将设置为前一天的日期,因此.now()
永远不会介于前一天的时间范围之间。
例如,如果您在 1 月 1 日调用设置早上和晚上,则存储的日期时间将为“1 月 1 日上午 8 点”和“1 月 1 日下午 4 点”。下次您的循环检查时,它会询问“1 月 2 日上午 10 点在 1 月 1 日上午 8 点和 1 月 1 日下午 4 点之间”,当然答案是否定的,因为 1 月 1 日是前一天。
如果您只想检查时间,您可能想使用datetime.time
课程而不是课程。datetime.datetime
或者,您可以将晚上和早上日期时间的日期部分设置为您想要匹配的特定日期(但这无助于每周重复)。
推荐阅读
- angular - 使吐司错误不堆叠
- sql - 查找日期范围内的记录,与年份无关
- ios - 如何从 .usdz 创建 SCNNode?
- sql - 在同一个表中使用父 id 选择父名称
- nginx - 同一域上的 nginx proxy_pass 导致 502 / 499
- javascript - 使用 javascript 淡入
- awesome-wm - 是否可以将客户端发送回 AwesomeWM 中的开始标签?
- c# - 使用 Linq to EF 使用数组作为搜索参数进行搜索
- npm - 纱线安装挂起,但 npm 使用相同的配置
- javascript - Javascript 无法提取 JSON 响应