Подсчитайте, сколько дней (понедельник - среда) между двумя датами - Woocommerce Бронирование? - PullRequest
0 голосов
/ 10 сентября 2018

Я борюсь с расчетом цен Woocommerce Bookings для типа "дни". Если цена в диапазоне дат (например, с понедельника по среду или в среду-субботу или в воскресенье-вторник ...) выше, чем в другие дни.

Пока я знаю, сколько дней:

$days = date_diff($from, $to)->format('%d');

Этот вопрос помогает определить количество дней: рассчитать воскресенье между двумя датами

Но как мне получить не только «воскресенья», но и каждый диапазон дат (например, от 6 до 2) с помощью:

$sundays = intval($days / 7) + ($from->format('N') + $days % 7 >= 7);

Полагаю, мне нужно пройтись по диапазону дат и использовать эту формулу, но я не могу понять, как.

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете использовать совершенно другой подход: Создайте объект DatePeriod и выполните цикл по объекту Period и увеличивайте переменную каждый раз, когда вы сталкиваетесь с диапазоном.

Следующий код достигает его, но возвращает только номер полного диапазона:

$from='2018/09/1';
$to='2018/09/31';

$start='Sunday';
$end='Thursday';

$go=false;
$period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
$nRange=0;
foreach($period as $date){
    if($date->format('l')===$start){
        $go=true;

    }
    if($go&&$date->format('l')===$end){
        $go=false;
        $nRange++;
    }
}

print_r($nRange);

вывод:

4

Отлично работает для любого выбранного диапазона.

Однако, если необходимо завершить какой-либо действительный день в заданном диапазоне или нет, вы можете изменить предыдущий код следующим образом:

 $from='2018/09/17';
    $to='2018/09/31';
    $start='Sunday';
    $end='Thursday';
    $day_num=['Monday'=>1,'Tuesday'=>2,'Wednesday'=>3,'Thursday'=>4,'Friday'=>5,'Saturday'=>6,'Sunday'=>7];
    $start_num=$day_num[$start];
    $end_num=$day_num[$end];


    $period=new DatePeriod(date_create($from),date_interval_create_from_date_string('1 days'),date_create($to));
    $nRange=0;

    if($start_num===$end_num){
        $valid_range=array_values($day_num);//keep the number of each day of the week
    }
    elseif($start_num>$end_num){
        $valid_range=array_values($day_num);//keep the number of each day of the week
        while($valid_range[0]!==$start_num){//rotate the values to keep the start day first
            $pop=array_shift($valid_range);
            array_push($valid_range,$pop);

        }
        $valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$start_num-$end_num);//keep only the days in the chosen range
    }else{
        $valid_range=array_values($day_num);//keep the number of each day of the week
        $valid_range=array_slice($valid_range,array_search($start_num,$valid_range),$end_num-$start_num); //keep only the days in the chosen range
    }
    $valid_range=array_flip($valid_range);//flip the array to make the search more fast
    foreach($period as $date){
        if(isset($valid_range[(int)$date->format('N')])){
            $nRange++;
        }
    }

    print_r($nRange);//output the number  of valid days 

Ouput:

 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...