Fqyeh29
@Fqyeh29
↓ ИМХО ↓

Формировка даты из кол-ва дней(+ условие). Где ошибка?

В переменной $DELIVERY находится кол-во дней на доставку.
Мне нужно просчитать точную дату, когда придет заказ.
Но тут есть условия:
1) В субботу и вск заказы не движутся
2) Заказы отгружаются в 12:00 (т.е после 12:00 +1 день)
3) доставка производится только в ПН,СР,ЧТ,ПТ
4) в $DELIVERY указан срок доставки до склада, до офиса еще +1 день.
$DELIVERY=5;
$date_w=date('w');

				if(($date_w==0) || ($date_w==6)){
				if ($date_w==6) $DELIVERY=$DELIVERY+1; 
				} else {
					if ($date_w==5) $DELIVERY=$DELIVERY+1; 
					if (date('H')>12) $DELIVERY=$DELIVERY+1; 
				}
				$DELIVERY=$DELIVERY+1;
				$DELIVERY=$DELIVERY+abs((intval($DELIVERY / 5)*2)-2);

				
				if ($DELIVERY==5) $DELIVERY=$DELIVERY+2;
				if(($date_w==2) || ($date_w==4)){
					$DELIVERY =$DELIVERY +1;
				}


				if(date("w",time()+86400*$DELIVERY)==6) $DELIVERY=$DELIVERY+2; 
				if(date("w",time()+86400*$DELIVERY)==0) $DELIVERY=$DELIVERY+1; 

				$DELIVERY_DT=date("d.m.y",time()+86400*$DELIVERY);


Местами верно, а местами не верно считает. Где ошибка(ки?)?
  • Вопрос задан
  • 127 просмотров
Решения вопроса 1
Urvin
@Urvin
<?php

define('C_TIME_ONE_DAY', 86400);

/**
 * @param int $from Дата заказа
 * @param int $daysCount Базовое число дней доставки
 * @param int $nextDayHour Заказы, сделанные после этого часа доставляются со следующего дня
 * @param array $freezeDays Дни недели, в которые заказы не движутся
 * @param array $deliveryDays Дни доставки
 * @return int
 */
function delivery($from, $daysCount, $nextDayHour, $freezeDays, $deliveryDays)
{
	if(!in_array(date('w', $from), $freezeDays)) {
		if(date('H', $from) > $nextDayHour - 1) {
			$from = strtotime('tomorrow', $from);
		} else {
			$from = strtotime('midnight', $from);
		}
	}

	while($daysCount > 0) {
		if(!in_array(date('w', $from), $freezeDays)) {
			$daysCount--;
		}
		$from += C_TIME_ONE_DAY;
	}

	while(!in_array(date('w', $from), $deliveryDays)) {
		$from += C_TIME_ONE_DAY;
	}

	return $from;
}

/*
 * 5 дней на доставку
 * Заказ, сделанный в 12:01 начинает доставляться со следующего дня
 * в субботу и воскресенье заказы не движутся
 * склад выдает заказы по пн,ср,чт,пт
 */
$deliveryDate = delivery(strtotime('2016-06-06 12:08'), 5, 12, [0,6], [1,3,4,5]);

echo 'warehouse: ', date('Y-m-d', $deliveryDate), PHP_EOL;
echo 'office: ', date('Y-m-d', $deliveryDate + C_TIME_ONE_DAY), PHP_EOL;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
11 мая 2024, в 00:19
1000 руб./за проект
10 мая 2024, в 23:51
30000 руб./за проект
10 мая 2024, в 23:33
2500 руб./за проект