За последние 24 часа нас посетили 22660 программистов и 1278 роботов. Сейчас ищут 764 программиста ...

Подскажите как сделать вывод таймслотов не занятого времени

Тема в разделе "PHP для профи", создана пользователем Sergio022, 15 ноя 2020.

  1. Sergio022

    Sergio022 Новичок

    С нами с:
    15 ноя 2020
    Сообщения:
    4
    Симпатии:
    0
    Всем привет, подскажите, пожалуйста, сломал всю голову себе, как решить задачу.

    Есть календарь для бронирования, в базе MySQL хранится информация о занятом времени (timestamp поля start и end).

    Задача- вывести доступное к бронированию время (таймслоты заданного размера с шагом по 30 минут).

    Например: берём день с 7:00 до 19:00, в этом дне занято с 7:30 до 9:00 и с 14:00 до 17:00 и нужно вывести доступное для бронирования время(например 1.5 часа с шагом в 30 минут).

    Должно вывестись:
    9:00-10:30;
    9:30-11:00;
    10:00-11:30;
    10:30-12:00;
    11:00-12:30;
    11:30-13:00;
    12:00-13:30;
    12:30-14:00;
    17:00-18:30;
    17:30-19:00
     
  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    Присоединяюсь к вопросу.

    P.S. Зачем реальное время хранить в БД? Возьмите точку отсчета и нумеруйте «слоты» ;)
     
  3. Sergio022

    Sergio022 Новичок

    С нами с:
    15 ноя 2020
    Сообщения:
    4
    Симпатии:
    0
    В базу попадают данные извне о занятом времени. То есть база занятого времени уже есть, задача с учётом этого вывести свободные слоты
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.794
    Симпатии:
    650
    В базу должно попадать то, что вам нужно! Когда я заглядывал в БД нашего сервиса бронирования, там реальное время только для информационных целей хранилось, а не для выстраивания списка занятости и т.п.
     
  5. Sergio022

    Sergio022 Новичок

    С нами с:
    15 ноя 2020
    Сообщения:
    4
    Симпатии:
    0
    В базе уже есть данные о занятом времени из другого календаря. Тут задача выводить свободные таймслоты и не хранить все время в базе, а передавать также только занятое время.
     
  6. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    PHP:
    1. <?php
    2.  
    3. $date = '2020-11-16';
    4. $work_start = $date.' 07:00:00';
    5. $work_end = $date.' 18:59:59';
    6.  
    7. $wstart = date_format(date_create($work_start), 'U');
    8. $wstop = date_format(date_create($work_end), 'U');
    9.  
    10. $timeslots = range($wstart, $wstop - 3600, 1800);
    11.  
    12.  
    13. //$sql = "SELECT UNIX_TIMESTAMP(`start`) AS `start`, UNIX_TIMESTAMP(`end`) AS `end`
    14. //FROM `tablename`
    15. //WHERE DATE(`start`) = '$date'
    16. //ORDER BY `start` ASC";
    17.  
    18. $db_result = array(
    19. array('start' => 1605504600, 'end' => 1605509999),
    20. array('start' => 1605528000, 'end' => 1605538799)
    21. ); // на эту дату занято с 07:30:00 до 08:59:59 и с 14:00:00 до 16:59:59
    22.  
    23. echo '<pre>';
    24.  
    25. foreach($timeslots as $utime)
    26. {
    27. echo date('H:i', $utime).' - '. date('H:i', $utime + 5400);
    28. $status = 'свободно';
    29.     foreach($db_result as $occupied)
    30.     {
    31.       if($utime >= $occupied['start'] && $utime < $occupied['end']
    32.       || $utime + 5399 >= $occupied['start'] && $utime + 5399 < $occupied['end'])
    33.        {
    34.        $status = 'занято';
    35.        }
    36.     }
    37. echo '  '.$status.'<br />';
    38. }
    39.  
    40. ?>
     
    #6 Drunkenmunky, 16 ноя 2020
    Последнее редактирование: 16 ноя 2020
    Sergio022 нравится это.
  7. Drunkenmunky

    Drunkenmunky Активный пользователь

    С нами с:
    12 авг 2020
    Сообщения:
    1.476
    Симпатии:
    281
    Вывод:
    Код (Text):
    1. 07:00 - 08:30  занято
    2. 07:30 - 09:00  занято
    3. 08:00 - 09:30  занято
    4. 08:30 - 10:00  занято
    5. 09:00 - 10:30  свободно
    6. 09:30 - 11:00  свободно
    7. 10:00 - 11:30  свободно
    8. 10:30 - 12:00  свободно
    9. 11:00 - 12:30  свободно
    10. 11:30 - 13:00  свободно
    11. 12:00 - 13:30  свободно
    12. 12:30 - 14:00  свободно
    13. 13:00 - 14:30  занято
    14. 13:30 - 15:00  занято
    15. 14:00 - 15:30  занято
    16. 14:30 - 16:00  занято
    17. 15:00 - 16:30  занято
    18. 15:30 - 17:00  занято
    19. 16:00 - 17:30  занято
    20. 16:30 - 18:00  занято
    21. 17:00 - 18:30  свободно
    22. 17:30 - 19:00  свободно
     
    Sergio022 нравится это.
  8. Sergio022

    Sergio022 Новичок

    С нами с:
    15 ноя 2020
    Сообщения:
    4
    Симпатии:
    0
    Это то что нужно, спасибо!