首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python3.7-如何在一分钟内使用datetime.now().strftime()执行具有开始和停止时间的循环?

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

Stack Overflow用户
提问于 2019-03-09 01:56:28
回答 1查看 354关注 0票数 -1

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

代码语言:javascript
复制
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“变量修改为:

代码语言:javascript
复制
now = datetime.now(timezone('US/Eastern')).strftime('%H:%M:%S.%f %Z')

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

使用strftime()可以精确地在一分钟内执行代码吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-09 02:10:07

编辑:(这现在是真正问题的答案(oops))

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

代码语言:javascript
复制
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())

举个例子:

代码语言:javascript
复制
wait_till(20, 24) # waiting till 20:24 (today)

并获取:

代码语言:javascript
复制
waiting for 15.32297 seconds
its now 2019-03-11 20:24:00.003857

这非常接近我们想要的(20:24:00.000000),这种延迟可能只是由于格式化字符串的计算延迟造成的。

(旧的东西...)

如果这不重要,它需要100.04546642303467% 5秒(而不是100.04546642303467% -->每次都会减少一点),你可以这样做

代码语言:javascript
复制
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%,您可以尝试此自动更正解决方案:

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55068547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档