Python 3.7 - 如何在分钟内使用 datetime.now().strftime() 执行带有开始和停止时间的循环?
Python 3.7 - How do I execute a loop with a start and stop time using datetime.now().strftime() on the minute?
我正在创建一个每 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() 是否可以在精确的分钟执行代码?
编辑:(现在这是真正问题的答案(糟糕))
如果你想等到 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% 5 秒并不重要(而是 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
我正在创建一个每 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() 是否可以在精确的分钟执行代码?
编辑:(现在这是真正问题的答案(糟糕))
如果你想等到 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% 5 秒并不重要(而是 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