Проблема с StartDate в период дат PHP (DatePeriod)


Я пытаюсь сделать функцию, в которой я выберите только день определенного диапазона дат, которые удовлетворяют условию определенного периода времени (например: первая пятница каждого месяца, последняя пятница каждого месяца, каждую пятницу, etc...), я искал, как это сделать, и кажется, что класс DatePeriod php-это хороший выбор.

Одна из проблем, с которыми я столкнулся, заключалась в том, что в этом диапазоне дат не я включал $endDay но увеличивая его на секунду до времени $end->setTime(0,0,1); я исправил это.

Теперь то же самое не происходит с $startDay, в этом случае, когда я создаю период, кажется, игнорирует, что дата начала соответствует условию периода.

Это мой код:

PHP

/* http://php.net/manual/es/datetime.formats.relative.php */
function daysByPeriod($startDay,$endDay,$inter){
    $start    = new DateTime($startDay);
    $end      = new DateTime($endDay);

    // Arreglo para incluir la fecha fin al periodo
    $end->setTime(0,0,1);

    $interval = DateInterval::createFromDateString($inter);
    $period = new DatePeriod($start, $interval, $end);

    foreach ($period as $dt) {
      echo $dt->format("l Y-m-d") . "<br>";
    }
  }

$dateStart1='20170706';
$dateEnd1='20180105';
echo "<strong>Primer viernes</strong> del mes del $dateStart1 al $dateEnd1<br>";
// Está incluyendo el día 2017-07-06 que no es viernes
// No está pintando el día 2017-07-07 que es viernes
daysByPeriod($dateStart1,$dateEnd1,'first friday of next month');

$dateStart2='20170525';
$dateEnd2='20180105';
echo "<strong>Último viernes</strong> del mes del $dateStart2 al $dateEnd2<br>";
// Está incluyendo el día 2017-05-25 que no es viernes
// No está pintando el día 2017-05-26 que es viernes
daysByPeriod($dateStart2,$dateEnd2,'last friday of next month');

$dateStart3='20170805';
$dateEnd3='20180105';
echo "Cada <strong>mes</strong> del $dateStart3 al $dateEnd3<br>";
// Aquí incluye la fecha inicio sin problema dentro el rango
daysByPeriod($dateStart3,$dateEnd3,'1 month'); 

$dateStart4='20170622';
$dateEnd4='20180105';
echo "Los <strong>viernes</strong> del $dateStart4 al $dateEnd4<br>";
// Está incluyendo el día 2017-06-22 que no es viernes
// Aquí incluye la fecha inicio sin problema dentro el rango
daysByPeriod($dateStart4,$dateEnd4,'next friday'); 

может кто-нибудь помочь мне с этим? Спасибо.

Author: Nache, 2017-09-03

1 answers

Интервал переходит от указанной даты к следующей дате в зависимости от условия. В первом случае часть даты 2017/07/06

2017/07/06 - > пропустить месяц до первой пятницы -> 2017/08/04

Здесь вы уже пропустили пятницу месяца 07 (поэтому она не появляется), и она появляется в день 06 месяца 07, потому что это ваше начало интервала.

Та же проблема возникает в следующем примере. Вы должны начать интервал в тот день, когда вам нужно либо поместить его вручную, либо предварительно вычислить.

 0
Author: Nache, 2017-09-03 19:45:55