Как вывести сообщение в заданный момент времени?

Как можно изменить мой код, чтобы он выводил сообщение только один раз в заданный момент времени, например, в '16:49:00', без завершения цикла, при этом сохранив проверку времени каждую секунду? В данный момент, если убрать секунды, всё работает, но сообщение выводится на протяжении всей минуты.
  • 9 октября 2024 г. 15:26
Ответы на вопрос 2
Для того чтобы вывести сообщение только один раз в заданный момент времени, вы можете использовать флаг, который будет отслеживать, было ли сообщение уже выведено. Вот пример кода на Python, который делает это:

```python
import time
from datetime import datetime

# Задайте время, в которое нужно вывести сообщение
target_time = '16:49:00'
message_shown = False  # Флаг, который отслеживает, было ли сообщение выведено

while True:
    # Получаем текущее время
    current_time = datetime.now().strftime('%H:%M:%S')
    print(f'Текущее время: {current_time}')
    
    # Проверяем, совпадает ли текущее время с целевым и было ли сообщение показано
    if current_time == target_time and not message_shown:
        print('Сообщение выводится в заданный момент времени!')
        message_shown = True  # Устанавливаем флаг, чтобы сообщение больше не показывалось

    time.sleep(1)  # Проверяем каждую секунду
```

### Объяснение кода:
1. **Импорт библиотек:** Мы используем `time` для приостановки выполнения в цикле и `datetime` для получения текущего времени.
2. **Целевое время:** Устанавливаем время, в которое нужно вывести сообщение, в формате `'HH:MM:SS'`.
3. **Флаг `message_shown`:** Это логическая переменная, которая отслеживает, было ли сообщение уже показано.
4. **Цикл:** Бесконечный цикл проверяет текущее время каждую секунду. Если текущее время совпадает с целевым и сообщение еще не было выведено, программа выводит сообщение и устанавливает флаг `message_shown` в `True`.
5. **Приостановка с `time.sleep(1)`:** Это позволит программе делать проверку каждую секунду.

Таким образом, сообщение будет выведено только один раз в указанное время, и программа продолжит работать, проверяя время каждую секунду.
import time

# Время берется 1 раз в момент запуска скрипта, чему оно будет равно?
now = datetime.now() 
current_time = now.strftime("%H:%M:%S")

# Цикл запущен и проверяет время, которое было взято 1 раз выше, что получится? Получится то, что цикл будет искать время, которое уже истекло.
while True:
    time.sleep(1)
    if current_time == '16:49:00':
        print('text')

# Так, щас 16:49:00?
# Ок, ждем 1 сек...
# Так, щас 16:49:01?
# Ок, ждем 1 сек...
# Так, щас 16:49:02?
# У нас время идет вперед или назад..? Если все таки вперед, то сможет ли оно достигнуть current_time, которое уже меньше, чем ожидаемое время..?

print() в помощь, чтобы понимать, что происходит в коде, если до полноценной отладки пока далеко:
import time
from datetime import datetime

while True:
    now = datetime.now()
    current_time = now.strftime("%H:%M:%S")

    if current_time == '17:15:00':
        print('text')
        time.sleep(1)
    else:
        print(f'Нихуа ({current_time})!')
        time.sleep(1)

# Нихуа (17:14:56)!
# Нихуа (17:14:57)!
# Нихуа (17:14:58)!
# Нихуа (17:14:59)!
# text
# Нихуа (17:15:01)! <--- Вот здесь оказывается Ваш первоначальный скрипт
# Нихуа (17:15:02)!
# Нихуа (17:15:03)! <--- Мы ждем какое время, 16:49:00?

P.S. Ваш код все таки сработает, когда пройдут сутки, но я не думаю, что так было задумано ;)
Похожие вопросы