Расчет даты доставки

Тема в разделе "Как сделать...", создана пользователем fonclub, 19 июн 2013.

  1. fonclub

    fonclub Постоялец

    Регистр.:
    28 май 2008
    Сообщения:
    135
    Симпатии:
    50
    Доброго времени суток, друзья! Пишу функцию для расчета даты доставки в магазине на основе нескольких параметров и столкнулся с проблемой, которую пока не удалось победить..
    Доставка зависит от нескольких параметров, заданных в настройках - ближайшая доставка при оформлении заказа до определенного времени (например завтра, при заказе сегодня до 16.00) и рабочих дней.
    Как я делаю сейчас. Выбираю в массив список ближайших 30 рабочих дней, смотрю на время заказа и если время уже больше, чем разрешенное в настройках, прибавляю сутки. Получаю предположительно день доставки ( в формате порядкового номера дня в году) и из массива рабочих дней пытаюсь найти подходящий. Но получается все не то, что нужно.. Может кто сталкивался с похожей задачей или понимаете, что я делаю не так? Подскажите пожалуйста.
     
  2. sofwar

    sofwar Создатель

    Регистр.:
    15 июл 2012
    Сообщения:
    10
    Симпатии:
    2
    Может я не совсем правильно вас понял но может попробовать так
    Код:
    $time=date('H', time());
    if($time >= '16'){
    //то добавляем + 1 день
    }else{
    // Оставляем все как есть
    }
    Код не проверял но должен работать
     
    fonclub нравится это.
  3. fonclub

    fonclub Постоялец

    Регистр.:
    28 май 2008
    Сообщения:
    135
    Симпатии:
    50
    Спасибо конечно, но это совсем не то) Вернее это всего лишь часть условий. Там нужно проверять не только на время, но и на то, какой день выпадает выходной или нет. Причем это дело нужно выполнять в цикле до тех пор, пока с учетом всех добавочных дней доставка не попадет на рабочий день.
     
  4. Waki

    Waki Постоялец

    Регистр.:
    14 ноя 2012
    Сообщения:
    64
    Симпатии:
    21
    Может так проверить попадает на выходной или нет.
    Код:
    $time=date('H', time());
    $weekend=date('N', time() + 86400);
    if($time >= '16' && $weekend <= 5){
    //то добавляем + 1 день;
    }elseif ($time >= '16' && ($weekend == 6 || $weekend == 7)) {
    switch ($weekend) {
    case 6: //то добавляем + 2 дня; break;
    case 7: //то добавляем + 1 день; break;
    }
    }else{
    // Оставляем все как есть
    }
    
     
    fonclub нравится это.
  5. fonclub

    fonclub Постоялец

    Регистр.:
    28 май 2008
    Сообщения:
    135
    Симпатии:
    50
    Да это актуально, когда у нас четко известно, что выходные - суббота и воскресенье, но в моем случае выходной может быть и среди недели, например праздничный день. А после прибавления нужного количества дней, учитывая выходные и время доставки, день доставки может попасть на нерабочий день. Это нужно все в цикле проверять до тех пор, пока мы не убедимся, что день не выходной. Например: у нас сегодня суббота 17.00, рабочие дни только среда и четверг, а доставка заказанного после 16.00 переносится на послезавтра. Получается, если бы сейчас было до 16.00 - то доставка послезавтра (с учетом выходных дней, воскресенье, понедельник, вторник) выпала бы на четверг, но т.к. время уже 17.00 она выпадает на пятницу, а пятница выходной)))) Вот и получается, что пройдясь циклом по всем дням и прибавляя +1 день при попадании на выходной у нас доставка получится аж на среду через неделю. Как-то так ;)
     
  6. Waki

    Waki Постоялец

    Регистр.:
    14 ноя 2012
    Сообщения:
    64
    Симпатии:
    21
    Если включая праздничные то думаю нужно вручную заполнить такие дни
    Cмысл такой, заполняются праздничные дни в массив, в котором массивы месяцев и в них уже праздничные дни для этого месяца.

    Код:
    <?php
     
    (is_numeric($_GET['t'])) ? $t = $_GET['t'] :
    printf('<form action="index.php" method="get">
    <input type="text" size="20" value="" name="t"/>
    <input type="submit" value="set" />
      </form>');
     
    $time = date("H", $t);
    $month = date("n", $t);
    $weekend = date('N', $t + 86400);
    $nextday = date('j', $t + 86400);
     
    $year = Array ( "1" => Array (),
    "2" => Array (),
    "3" => Array (),
    "4" => Array (),
    "5" => Array (),
    "6" => Array (),
    "7" => Array ("1", "2", "3", "4"),
    "8" => Array (),
    "9" => Array (),
    "10" => Array (),
    "11" => Array (),
    "12" => Array () );
     
    while (!($set)) {
    if ($time > 16) {
    $weekend = date('N', $t + 86400);
    $nextday = date('j', $t + 86400);
    if ($weekend <= 5 && !in_array($nextday, $year[$month])) {
    $set = true;
    $t = $t + 86400;
    } else {
    $t = $t + 86400;
    $nextday = $nextday + 1;
    }
    } else {
    $set = true;
    }
    }
    if (!empty($t))
    echo "доставка: " . " в " . date("l", $t) . " (" . date("d-m-Y", $t) . ")";
    ?>
    
    как-то так
     
    fonclub нравится это.
  7. fonclub

    fonclub Постоялец

    Регистр.:
    28 май 2008
    Сообщения:
    135
    Симпатии:
    50
    Интересно получилось, попробую доработать под свою задачу. Может и подойдет Ваш вариант, у меня кода гораздо больше, но работает уже 100% так как мне было нужно.