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

fonclub

Постоялец
Регистрация
28 Май 2008
Сообщения
135
Реакции
52
Доброго времени суток, друзья! Пишу функцию для расчета даты доставки в магазине на основе нескольких параметров и столкнулся с проблемой, которую пока не удалось победить..
Доставка зависит от нескольких параметров, заданных в настройках - ближайшая доставка при оформлении заказа до определенного времени (например завтра, при заказе сегодня до 16.00) и рабочих дней.
Как я делаю сейчас. Выбираю в массив список ближайших 30 рабочих дней, смотрю на время заказа и если время уже больше, чем разрешенное в настройках, прибавляю сутки. Получаю предположительно день доставки ( в формате порядкового номера дня в году) и из массива рабочих дней пытаюсь найти подходящий. Но получается все не то, что нужно.. Может кто сталкивался с похожей задачей или понимаете, что я делаю не так? Подскажите пожалуйста.
 
Может я не совсем правильно вас понял но может попробовать так
Код:
$time=date('H', time());
if($time >= '16'){
//то добавляем + 1 день
}else{
// Оставляем все как есть
}
Код не проверял но должен работать
 
Может я не совсем правильно вас понял но может попробовать так
Спасибо конечно, но это совсем не то) Вернее это всего лишь часть условий. Там нужно проверять не только на время, но и на то, какой день выпадает выходной или нет. Причем это дело нужно выполнять в цикле до тех пор, пока с учетом всех добавочных дней доставка не попадет на рабочий день.
 
Спасибо конечно, но это совсем не то) Вернее это всего лишь часть условий. Там нужно проверять не только на время, но и на то, какой день выпадает выходной или нет. Причем это дело нужно выполнять в цикле до тех пор, пока с учетом всех добавочных дней доставка не попадет на рабочий день.

Может так проверить попадает на выходной или нет.
Код:
$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{
// Оставляем все как есть
}
 
Может так проверить попадает на выходной или нет.
Код:
$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{
// Оставляем все как есть
}
Да это актуально, когда у нас четко известно, что выходные - суббота и воскресенье, но в моем случае выходной может быть и среди недели, например праздничный день. А после прибавления нужного количества дней, учитывая выходные и время доставки, день доставки может попасть на нерабочий день. Это нужно все в цикле проверять до тех пор, пока мы не убедимся, что день не выходной. Например: у нас сегодня суббота 17.00, рабочие дни только среда и четверг, а доставка заказанного после 16.00 переносится на послезавтра. Получается, если бы сейчас было до 16.00 - то доставка послезавтра (с учетом выходных дней, воскресенье, понедельник, вторник) выпала бы на четверг, но т.к. время уже 17.00 она выпадает на пятницу, а пятница выходной)))) Вот и получается, что пройдясь циклом по всем дням и прибавляя +1 день при попадании на выходной у нас доставка получится аж на среду через неделю. Как-то так ;)
 
Если включая праздничные то думаю нужно вручную заполнить такие дни
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) . ")";
?>
как-то так
 
Интересно получилось, попробую доработать под свою задачу. Может и подойдет Ваш вариант, у меня кода гораздо больше, но работает уже 100% так как мне было нужно.
 
Назад
Сверху