如何在分钟上使用 datetime.now().strftime() 执行具有开始和停止时间的循环?

我正在创建一个每 5 秒执行一次的循环,从 startTime 变量开始,到 stopTime 变量结束。但是,下面的代码忽略了我的 startTime 和 endTime 变量中的分钟数,并且只在小时内执行。例如,即使我的 startTime 是“1130”,代码也会在 11:05 执行,而不是结束循环。我对 endTime 变量有同样的问题。如果当前时间为 12:45,即使 endTime 变量为“1230”,代码仍会执行。代码将在“1300”处停止执行。


frequency = 5 

startTime = '1130' 

endTime = '1230' 

while True: 

     now = datetime.now().strftime('%H:%M:%S')

     if startTime <= now <= endTime:

         print('Loop is working. Time is: ',now)

         time.sleep(frequency)

     else:

          print('Loop is stopped')

          break

我住在中部时间,所以我尝试通过修改“now”变量来切换到东部时区:


now = datetime.now(timezone('US/Eastern')).strftime('%H:%M:%S.%f %Z')

但是当我使用东部 datetime.now() 用 startTime 和 endTime 替换东部时间时,我仍然遇到同样的问题。


是否可以使用 strftime() 在精确的分钟内执行代码?


ITMISS
浏览 243回答 1
1回答

阿晨1998

如果您想等到例如 11:30 (这是真正的问题), 您可以计算程序应该休眠的时间(以秒为单位)(并让它休眠):def wait_till(hour, minute, second=0):&nbsp; &nbsp; # get system time (and date)&nbsp; &nbsp; now_time = datetime.datetime.now()&nbsp; &nbsp; # create time point we are waiting for (this year, this month and this day)&nbsp; &nbsp; wait_till_time = datetime.datetime(year=now_time.year, month=now_time.month, day=now_time.day, hour=hour, minute=minute, second=second)&nbsp; &nbsp; # calculate time we want to wait for and convert to seconds&nbsp; &nbsp; wait_for = (wait_till_time - now_time).total_seconds()&nbsp; &nbsp; # check if it's going to be tomorrow (if we would sleep for a negative amount of seconds)&nbsp; &nbsp; if wait_for < 0:&nbsp; &nbsp; &nbsp; &nbsp; # add one day&nbsp; &nbsp; &nbsp; &nbsp; wait_till_time = wait_till_time.replace(day=now_time.day+1)&nbsp; &nbsp; &nbsp; &nbsp; # recalculate (not very beautiful, but i don't know a better way)&nbsp; &nbsp; &nbsp; &nbsp; wait_for = (wait_till_time - now_time).total_seconds()&nbsp; &nbsp; # printing this waiting time (in seconds)&nbsp; &nbsp; print("waiting for",wait_for,"seconds")&nbsp; &nbsp; # sleeping for that time&nbsp; &nbsp; time.sleep(wait_for)&nbsp; &nbsp; # printing the new now time, so we can see how accurate it is&nbsp; &nbsp; print("its now",datetime.datetime.now())并说例如:wait_till(20, 24) # waiting till 20:24 (today)并得到:waiting for 15.32297 secondsits now 2019-03-11 20:24:00.003857这非常接近我们想要的 (20:24:00.000000),而且这种延迟可能只是由格式化字符串的计算滞后引起的。(老东西……)如果需要100% 5s并不重要(而是100.04546642303467% --> 每次都会下降一点),您可以这样做import timefrequency = 5 #every 5 secondsstart_time = time.time()while 1:&nbsp; &nbsp; elspsed_time = time.time() - start_time&nbsp; &nbsp; print(elspsed_time)&nbsp; &nbsp; time.sleep(frequency)但是如果你需要100%你可以试试这个自动更正的解决方案:import timefrom threading import Timerfrequency = 5 #every 5 secondsstart_time = time.time()def what_to_do_after_5s():&nbsp; &nbsp; elapsed_time = time.time() - start_time&nbsp; &nbsp; print(elapsed_time)&nbsp; &nbsp; # next call&nbsp; &nbsp; Timer(5.0 - (elapsed_time - int(elapsed_time)), what_to_do_after_5s, ()).start()what_to_do_after_5s()我们可以看到它会自动更正:0.05.00017070770263710.00027298927307115.00053906440734920.00124883651733425.0004644393920930.00092935562133835.0014286041259840.000768899917645.0012843608856250.0004544258117755.00068306922912660.0012388229370165.0009541511535670.0015127658844
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python