Почему у меня время меняет свой формат?

Доброго времени суток. Пишу tg бота который будет бронировать помещение. Сейчас работаю над тем, чтобы человек не мог бронировать на уже забронированное другим человеком время. Проблема в том, что при сохранении времени начала бронирования start_time, учитывая что у меня явно указан формат времени ЧЧ:ММ он нме дописывает еще и секунды. С временем конца бронирования такой проблемы нет, хотя код идентичен...
Запись времени начала бронирования и окончания содержатся в двух функциях.
Я исключил из данного кода все лишние обработчики, проверки и тд, для уменьшения масштабности кода.
Функция записи начала времени бронирования:
def save_reservation_time(message, reservation_data):
    reservation_time = message.text.strip()

    hours, minutes = map(int, reservation_time.split(':'))
    selected_time = dt.time(hours, minutes)

    start_time = dt.time(9, 0)
    end_time_range = dt.time(22, 0)
    print(f"start_time1: {start_time}")
    if selected_time < start_time or selected_time > end_time_range:
        bot.send_message(message.chat.id,
                         'Выбранное время не входит в допустимый диапазон (09:00 - 22:00). Пожалуйста, выберите другое время.')
        bot.register_next_step_handler(message, save_reservation_time, reservation_data)
        return

    reservation_data['start_time'] = selected_time.strftime('%H:%M')
    print(f"start_time2: {start_time}")
    bot.send_message(message.chat.id, 'Введите время окончания бронирования в формате ЧЧ:ММ: ')
    bot.register_next_step_handler(message, save_end_time, reservation_data)

Далее идёт запись времени окончания бронирования
def save_end_time(message, reservation_data):
    end_time = message.text.strip()
    
    hours, minutes = map(int, end_time.split(':'))

    start_time = dt.time(9, 0)
    end_time_range = dt.time(22, 0)
    selected_end_time = dt.time(hours, minutes)
    if selected_end_time < start_time or selected_end_time > end_time_range:
        bot.send_message(message.chat.id,
                         'Выбранное время не входит в допустимый диапазон (09:00 - 22:00). Пожалуйста, выберите другое время.')
        bot.register_next_step_handler(message, save_end_time, reservation_data)
        return

    start_hours, start_minutes = map(int, reservation_data['start_time'].split(':'))
    start_time = dt.time(start_hours, start_minutes)

    print(f"start_time3: {start_time}")

    reservation_data['end_time'] = selected_end_time.strftime('%H:%M')
    reservation_data['reservation_time'] = reservation_data['start_time'] + ' - ' + reservation_data['end_time']
    print(f"start_time4: {start_time}")
    result = is_time_slot_available(reservation_data['reservation_date'], reservation_data['start_time'],
                                    reservation_data['end_time'])
    if result is not None:
        bot.send_message(message.chat.id, result, reply_markup=edit_keyboard)
        bot.register_next_step_handler(message, handle_edit_time_or_date)
        return

    print(f"start_time: {start_time}")
    print(f"end_time: {end_time}")
    print(f"result: {result}")
    print(reservation_data)
    bot.send_message(message.chat.id, 'Введите ФИО организатора:')
    bot.register_next_step_handler(message, save_organizer_name, reservation_data)

При объявлении переменной result идёт функция is_time_slot_available, которая проверяет доступность слота. Её я проверял, в ней в единственной формат хранится правильно.
def is_time_slot_available(reservation_date, start_time, end_time):
    global sheet

    values = sheet.get_all_values()
    for row in values:
        if (
                row[2] == reservation_date and
                row[10] is not None and
                row[11] is not None
        ):
            existing_start_time = datetime.strptime(row[10], "%H:%M").time()
            existing_end_time = datetime.strptime(row[11], "%H:%M").time()

            start_time_dt = datetime.strptime(start_time, "%H:%M").time()
            end_time_dt = datetime.strptime(end_time, "%H:%M").time()

            print(f"start_time_000: {start_time}")

            if (
                    start_time_dt < existing_end_time and
                    end_time_dt > existing_start_time
            ):
                available_time_slots = get_available_time_slots(reservation_date)
                message = 'Выбранное время уже забронировано. Пожалуйста, выберите другое время.\n\nУже забронированные временные слоты:\n'
                message += '\n'.join(available_time_slots)
                return message
    print(f"start_time_001: {start_time}")
    return None


Так же не выводится start_time_000 в цикле, который должен пройтись по всем строкам базы и выяснить забронировано уже время или нет
Приложу выводы с принтов:
start_time1: 09:00:00
start_time2: 09:00:00
start_time3: 10:30:00
start_time4: 10:30:00
start_time_001: 10:30
start_time: 10:30:00
end_time: 12:30
result: None


То есть время изначально в ЧЧ:ММ:СС, хотя в словаре он сохраняется в ЧЧ:ММ
{'id': 1, 'user_id': 1348671573, 'reservation_date': datetime.date(2024, 2, 12), 'reservation_time': '10:30 - 12:30', 'start_time': '10:30', 'end_time': '12:30'}


Подскажите, в чём заключается проблема, заранее спасибо за ваши ответы)
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
объект времени start_time = dt.time(9, 0) - всегда будет иметь секунды, и если ему всегда не задавать форматирование при печати, будет печатать с секундами.
В своем формате в строку вы переводе только в двух случаях, вот они и как вы хотите и выглядит.

То есть не надо путать строки и объект time
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы