Как вернуть определенные дни между двумя датами в PHP - PullRequest
0 голосов
/ 27 сентября 2018

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

Клиент хотел, чтобы я сохранял даты каждого понедельника и среды между двумя указанными датами.

(Ни дата начала, ни дата окончания не были начаты ни в понедельник, ни в среду).

Ответ ниже ...

Ответы [ 2 ]

0 голосов
/ 27 сентября 2018
  • Вы можете использовать DateTime и DateInterval, чтобы перейти непосредственно к тому же дню следующей недели и отследить, превышает ли он дату окончания или нет, используя метод diff().

КОД:

$next_monday    = new DateTime("next Monday");
$next_wednesday = new DateTime("next Wednesday");
$one_week = new DateInterval("P1W");
$end_date = new DateTime(date("Y-m-d")." +100 days");


$valid_dates = [];

while(true){
    if($next_monday->diff($end_date)->invert === 1){
        break;
    }
    $valid_dates[] = $next_monday->format("Y-m-d");
    if($next_wednesday->diff($end_date)->invert === 1){
        break;
    }
    $valid_dates[] = $next_wednesday->format("Y-m-d");
    $next_monday->add($one_week);
    $next_wednesday->add($one_week);
}


foreach($valid_dates as $each_date){
    echo $each_date," ",date("D",strtotime($each_date)),"<br/>"; // to cross verify whether it's really Monday or Wednesday or not. 
}

ВЫХОД:

2018-10-01 Mon
2018-10-03 Wed
2018-10-08 Mon
2018-10-10 Wed
2018-10-15 Mon
2018-10-17 Wed
2018-10-22 Mon
2018-10-24 Wed
2018-10-29 Mon
2018-10-31 Wed
2018-11-05 Mon
2018-11-07 Wed
2018-11-12 Mon
2018-11-14 Wed
2018-11-19 Mon
2018-11-21 Wed
2018-11-26 Mon
2018-11-28 Wed
2018-12-03 Mon
2018-12-05 Wed
2018-12-10 Mon
2018-12-12 Wed
2018-12-17 Mon
2018-12-19 Wed
2018-12-24 Mon
2018-12-26 Wed
2018-12-31 Mon
2019-01-02 Wed

ПРИМЕЧАНИЕ:

Вы можете добавить 86400 секунд к дате начала strtotime() и запустить цикл для проверки каждого дня подряд (который будет работать нормально).Однако, если вы попытаетесь добавить 86400 * 2 или 86400 * 5, чтобы пропустить последние 2 или 5 дней с текущего дня, у вас возникнут проблемы, если вы не начнете цикл с даты начала midnight.

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

Инструкции

Сначала сохраните все необходимые дни недели в массиве.Я использую форму для краткой даты (D), но вы можете использовать форму для длинных (l):

$days = ["Mon", "Wed"];   //If <PHP7 use $days = array("Mon", "Wed"); 

Затем преобразуйте дату начала и окончания в метки времени:

$starttimestamp = strtotime($start_date);
$endtimestamp = strtotime($end_date);

Затем выполните цикл FOR, добавив 86400 микросекунд (ровно 1 день) к каждому циклу.Это даст нам новую временную метку для каждого дня между двумя днями.Создайте новую строку дня для каждого цикла:

for(  $j=$starttimestamp;  $j<=$endtimestamp;  $j+=86400)
{
    $tmpday = date('D',$j);
    ...
}

Наконец, выполните проверку in_array (например, если needle в стоге сена), чтобы увидеть, совпадает ли DAY с любым из наших требуемых дней:

for(  $j=$starttimestamp;  $j<=$endtimestamp;  $j+=86400)
{
    $tmpday = date('D',$j);

    if(in_array($tmpday, $avail_days) ){
           echo date('Y-m-d',$j);
    }
}

Это все, что нужно сделать.Весь код можно увидеть ниже.Я надеюсь, что это поможет кому-то еще в будущем:

Весь код

$avail_days     = ["Mon", "Wed"];    //If <PHP7 use $days = array("Mon", "Wed"); 
$starttimestamp = strtotime($your_start_date);
$endtimestamp   = strtotime($your_end_date);

for( $j = $starttimestamp;  $j <= $endtimestamp;  $j += 86400 )
{

    $tmpday = date('D',$j);

    if(in_array($tmpday, $avail_days) ){

           echo date('Y-m-d',$j);  //This date has a day that matches your required days!

    }

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