为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

ITMISS 2021-11-30 17:04:15
我正在创建一个每 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() 在精确的分钟内执行代码?
查看完整描述

1 回答

?
阿晨1998

TA贡献2037条经验 获得超6个赞

如果您想等到例如 11:30 (这是真正的问题), 您可以计算程序应该休眠的时间(以秒为单位)(并让它休眠):


def wait_till(hour, minute, second=0):

    # get system time (and date)

    now_time = datetime.datetime.now()

    # create time point we are waiting for (this year, this month and this day)

    wait_till_time = datetime.datetime(year=now_time.year, month=now_time.month, day=now_time.day, hour=hour, minute=minute, second=second)

    # calculate time we want to wait for and convert to seconds

    wait_for = (wait_till_time - now_time).total_seconds()

    # check if it's going to be tomorrow (if we would sleep for a negative amount of seconds)

    if wait_for < 0:

        # add one day

        wait_till_time = wait_till_time.replace(day=now_time.day+1)

        # recalculate (not very beautiful, but i don't know a better way)

        wait_for = (wait_till_time - now_time).total_seconds()


    # printing this waiting time (in seconds)

    print("waiting for",wait_for,"seconds")

    # sleeping for that time

    time.sleep(wait_for)

    # printing the new now time, so we can see how accurate it is

    print("its now",datetime.datetime.now())

并说例如:


wait_till(20, 24) # waiting till 20:24 (today)

并得到:


waiting for 15.32297 seconds

its now 2019-03-11 20:24:00.003857

这非常接近我们想要的 (20:24:00.000000),而且这种延迟可能只是由格式化字符串的计算滞后引起的。


(老东西……)


如果需要100% 5s并不重要(而是100.04546642303467% --> 每次都会下降一点),您可以这样做


import time


frequency = 5 #every 5 seconds

start_time = time.time()


while 1:

    elspsed_time = time.time() - start_time

    print(elspsed_time)

    time.sleep(frequency)

但是如果你需要100%你可以试试这个自动更正的解决方案:


import time

from threading import Timer


frequency = 5 #every 5 seconds

start_time = time.time()


def what_to_do_after_5s():

    elapsed_time = time.time() - start_time


    print(elapsed_time)


    # next call

    Timer(5.0 - (elapsed_time - int(elapsed_time)), what_to_do_after_5s, ()).start()


what_to_do_after_5s()

我们可以看到它会自动更正:


0.0

5.000170707702637

10.000272989273071

15.000539064407349

20.001248836517334

25.00046443939209

30.000929355621338

35.00142860412598

40.0007688999176

45.00128436088562

50.00045442581177

55.000683069229126

60.00123882293701

65.00095415115356

70.0015127658844


查看完整回答
反对 回复 2021-11-30
  • 1 回答
  • 0 关注
  • 242 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信