Python - пока цикл не работает со временем - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть код, который запускает главную функцию . В этой функции есть while loop, который должен запускать программу, когда наступит определенное время. Я установил это время в morning (время начала), evening (время окончания) переменных. Он находится в цикле while и работает, но только если я запускаю программу в тот день, когда хочу ее использовать. Например: когда я запускаю его вечером в понедельник (20:00) и start время (переменная morning) начинается с 8:00 (следующий день), он продолжает цикл

print («Ожидание подходящего времени») <= (делает это) </p>

даже если это время наступит на следующий день. Но это работает, когда я запускаю его на следующий день в 6:00 или около того ...

Может кто-нибудь объяснить мне, почему это происходит? Вот код

import datetime
from time import sleep
from datetime import date


#variables
now = datetime.datetime.now()
morning = now.replace(hour=8, minute=0, second=0, microsecond=0)
evening = now.replace(hour=16, minute=15, second=0, microsecond=0)

#function for time-setting
def time_in_range(morning, evening, x):
    if morning <= evening:
        return morning <= x <= evening
    else:
        return morning <= x or x <= evening


timerange = time_in_range(morning, evening, now)


#main function
def main():
    while True:
# Time period check
        if date.today().weekday() < 5 and date.today().weekday() >= 0:
            dayz = True
        else:
            dayz = False
        if dayz != True:
            print("Waiting for the day")
            sleep(3600)
            continue
        now = datetime.datetime.now()
        timerange = time_in_range(morning, evening, now)
        if timerange != True:  # HERE IT MAKES THE TROUBLE
            print("Waiting for the right time")
            sleep(200)
            continue
        print("do something")

main()

print("end of code")

Ответы [ 2 ]

2 голосов
/ 17 апреля 2019

Когда вы вызываете .replace() для установки значений morning и evening, текущая дата сохраняется как часть объекта datetime.Таким образом, если бы вы назвали его днем ​​ранее, даты будут установлены на дату предыдущего дня, и, таким образом, .now() никогда не будет находиться в промежутке времени предыдущего дня.

Например, если 1 января вызвоните, чтобы установить утро и вечер, сохраненные даты будут «1 января 8 утра» и «1 января 4 вечера».В следующий раз, когда ваш цикл проверяется, он спрашивает: «Это 2 января 10:00 между 1 января 8:00 и 1 января 16:00», и, конечно, ответ «нет», потому что 1 января было накануне.

Возможно, вы хотитеиспользовать класс datetime.time вместо класса datetime.datetime, если вы хотите проверить только время.В качестве альтернативы, вы можете установить для части даты вашего вечернего и утреннего времени определенную дату, которую вы хотите сопоставить (но это не поможет повторять каждую неделю).

0 голосов
/ 17 апреля 2019
import datetime
from time import sleep
from datetime import date




#variables
now = datetime.datetime.now()
morning = now.replace(hour=8, minute=0, second=0, microsecond=0)
evening = now.replace(hour=16, minute=15, second=0, microsecond=0)

#function for time-setting
def time_in_range(morning, evening, x):
    # Updated code
    morning = x.replace(hour=8, minute=0, second=0, microsecond=0)
    evening = x.replace(hour=16, minute=15, second=0, microsecond=0)
    if morning <= evening:
        return morning <= x <= evening
    else:
        return morning <= x or x <= evening


timerange = time_in_range(morning, evening, now)
print(timerange)




#main function
def main():
    while True:
# Time period check
        if date.today().weekday() < 5 and date.today().weekday() >= 0:
            dayz = True
        else:
            dayz = False
        if dayz != True:
            print("Waiting for the day")
            sleep(3600)
            continue
        now = datetime.datetime.now()
        timerange = time_in_range(morning, evening, now)
        if timerange != True:  # HERE IT MAKES THE TROUBLE
            print("Waiting for the right time")
            sleep(200)
            continue
        print("do something")

main()

print("end of code")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...