Скрипт "Режим работы": проблемы с датами

Shurikkan

Новичок
Всем привет.

Для посетителей сайта нужно отображать информацию о том работает заведение или нет.
Задача показалась очень простой, но потом столкнулся с факапом в плане дней недели...

ЗАТЫК:
В выходные заведение открывается утром одного дня, а закрывается ночью следующего.

Что сделал изначально:
PHP:
class ModWorkingtimeHelper {

    public static function checkTime($data) {
     
       date_default_timezone_set('Europe/Moscow');
       $weekDay = date('N');
       $curTime = date('H:i');

       $fieldFromName   = 'timeFrom'.$weekDay;
       $fieldToName   = 'timeTo'.$weekDay;
     
       $workTime = Array(
           'timeFrom'   => $data->get($fieldFromName,   '00:00'),
           'timeTo'   => $data->get($fieldToName,    '00:00')
       );
     
       $toodayFrom   = $workTime['timeFrom'];
       $toodayTo   = $workTime['timeTo'];
     
       if($curTime > $toodayFrom && $curTime < $toodayTo) {
           return 1;
       } else {
           return 2;
       }
     
    }
}
Метод $data->get(...) пытается получить из настроек модуля CMS время на текущий день недели и, если он там не указан, подставляет 00:00 как значение по-умолчанию.

Проблема в том, что модуль при проверки режима работы берёт текущий день недели и проверяет расписание по нему. То есть, если 1 января заведение работает с 12:00 до 03:00, зайдя на сайт 2 января в 01:00 пользователь увидит сообщение о том, что заведение закрыто.

Вот, думаю как сделать... Видимо, при работе скрипта нужно сначала проверять прошлый день и смотреть закрылось ли заведение или нет?

Как-то так. Надеюсь, понятно изложил. Посодействуете в решении?

----
Хех, пока писал ещё один вариант пришёл: составлять сразу на базе данных из админки массив с расписанием на неделю (сейчас просто отдельные дни с расписанием) и работать уже с ним?

ПРИМЕР:
Прошлая смена с 00:00 до 03:00, сегодняшная смена - с 10:00 до 21:00.

P.S.: Тут при вставке кодов в сообщение их никакими тегами не нужно обрамлять? оО
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
P.S.: Тут при вставке кодов в сообщение их никакими тегами не нужно обрамлять? оО
[ php ] (без пробелов)

с расписанием на неделю
Будет та же проблема в ночь с воскресенья на понедельник.

1 января заведение работает с 12:00 до 03:00
1 января работает с 12:00 до полуночи, а 2 января с полуночи до 03:00 и с 10:00 до 21:00
 

AmdY

Пью пиво
Команда форума
А как у вас хранится это самое рабочее время?
 

Nexus_Noob

Новичок
Я бы получил список всех "расписаний работы" (ну или ближайших к текущему дню);
Перевел все значения начала и конца раб. дня в unix time;
В цикле начал бы проверять вхождение текущей метки времени в имеющийся интервал;
Если текущее время больше или равно началу раб. дня и меньше или равно его концу, то это искомое значение.
 

Shurikkan

Новичок
В общем, чё-то не могу я сформировать расписание корректное))
Не пойму в чём ошибка. Не заполняются элементы массива "nigth".
Даты получаются, сравнение происходит, но элемент массива не обновляется.

PHP:
class ModWorkingtimeHelper {

    public static function getSchedule($params) {
      
       date_default_timezone_set('Europe/Moscow');
       $weekDay = date('N');
       $curTime = date('H:i');
      
        $weekSchedule = Array(
            1 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom1',   '00:00'),
                   'timeTo'   => $params->get('timeTo1',        '00:00')
               )
            ),
            2 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom2',   '00:00'),
                   'timeTo'   => $params->get('timeTo2',        '00:00')
               )
            ),
            3 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom3',   '00:00'),
                   'timeTo'   => $params->get('timeTo3',        '00:00')
               )
            ),
            4 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom4',   '00:00'),
                   'timeTo'   => $params->get('timeTo4',        '00:00')
               )
            ),
            5 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom5',   '00:00'),
                   'timeTo'   => $params->get('timeTo5',        '00:00')
               )
            ),
            6 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom6',   '00:00'),
                   'timeTo'   => $params->get('timeTo6',        '00:00')
               )
            ),
            7 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom7',   '00:00'),
                   'timeTo'   => $params->get('timeTo7',        '00:00')
               )
            )
        );
      
        $weekScheduleCnt = count($weekSchedule);
      
        for($i = 1; $i <= $weekScheduleCnt; $i++) {
          
           $curDay       = $weekSchedule[$i];
           $curDayFrom   = $curDay['day']['timeFrom'];
           $curDayTo   = $curDay['day']['timeTo'];
          
           $i == 1 ? $lastDay = $weekSchedule[$weekScheduleCnt] : $lastDay = $weekSchedule[$i-1];
           $lastDayFrom   = $lastDay['day']['timeFrom'];
           $lastDayTo       = $lastDay['day']['timeTo'];
          
           if(date($lastDayFrom) > date($lastDayTo)) {
               $curDay['night']['timeFrom']    = '00:00';
               $curDay['night']['timeTo']        = $lastDayTo;
           }
          
           if(date($curDayFrom) > date($curDayTo)) {
               $curDayTo = '00:00';
           }
          
        }
      
       return $weekSchedule;
      
    }

}
 
Последнее редактирование:

Nexus_Noob

Новичок
В общем, чё-то не могу я сформировать расписание корректное))
Не пойму в чём ошибка. Не заполняются элементы массива "nigth".
Даты получаются, сравнение происходит, но элемент массива не обновляется.
Попробуйте так (работоспособность не проверял):
PHP:
<?
class ModWorkingtimeHelper {
    public static function getSchedule($params) {
        $weekSchedule = Array(
            1 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom1',   '00:00'),
                   'timeTo'   => $params->get('timeTo1',        '00:00')
               )
            ),
            2 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom2',   '00:00'),
                   'timeTo'   => $params->get('timeTo2',        '00:00')
               )
            ),
            3 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom3',   '00:00'),
                   'timeTo'   => $params->get('timeTo3',        '00:00')
               )
            ),
            4 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom4',   '00:00'),
                   'timeTo'   => $params->get('timeTo4',        '00:00')
               )
            ),
            5 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom5',   '00:00'),
                   'timeTo'   => $params->get('timeTo5',        '00:00')
               )
            ),
            6 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom6',   '00:00'),
                   'timeTo'   => $params->get('timeTo6',        '00:00')
               )
            ),
            7 => Array(
               'night' => Array(
                   'timeFrom'   => '',
                   'timeTo'   => ''
               ),
               'day' => Array(
                   'timeFrom'   => $params->get('timeFrom7',   '00:00'),
                   'timeTo'   => $params->get('timeTo7',        '00:00')
               )
            )
        );
    
        $week_start=strtotime(date('w')==1?'Monday':'last Monday',time());
        $DAY=60*60*24;
        $time=time();
        foreach(array_values($weekSchedule) as $k=>$item){
            $cur_day=$week_start+$k*$DAY;
            $begin=strtotime($item['day']['timeFrom'],$cur_day);
            $end=strtotime($item['day']['timeTo'],$cur_day);
            if($end<$begin)
                $end+=$DAY;
        
            if($time>=$begin and $time<=$end)
                return $item;
        };

        return null;
    }
}
 
Последнее редактирование:
Сверху