Python 3.7 - Как выполнить цикл с временем начала и окончания, используя datetime.now (). Strftime () в минуту? - PullRequest
0 голосов
/ 08 марта 2019

Я создаю цикл, который выполняется каждые 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 = datetime.now(timezone('US/Eastern')).strftime('%H:%M:%S.%f %Z')

но у меня все еще возникает та же проблема, когда я заменяю восточное время на startTime и endTime при использовании восточного datetime.now ().

Возможно ли выполнение кода в точную минуту с помощью strftime ()?

1 Ответ

0 голосов
/ 08 марта 2019

РЕДАКТИРОВАТЬ: (теперь это ответ на реальный вопрос (упс))

Если вы хотите подождать, например, до 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
...