У меня есть конкретная дата — для этого примера, скажем, 6 июля. Она выпадает на 27 неделе 2016 года.
Используя PHP 5.5.9, я пытаюсь вернуть 7 дат, которые происходят на этой неделе, используя следующую функцию:
function getStartAndEndDate($week, $year) {
$i=0;
$dto = new DateTime();
$ret[$i] = $dto->setISODate($year, $week)->format('Y-m-d');
$i++;
while ( $i < 7 ){
$ret[$i] = $dto->modify('+' . $i . ' days')->format('Y-m-d');
$i++;
}
return $ret;
}
Я ожидаю список из 7 последовательных дат с 2016-07-04 по 2016-07-10
Вместо этого я получаю следующие даты:
2016-07-04, 2016-07-05, 2016-07-07, 2016-07-10 2016-07-14 2016-07-19, 2016-07-25
Я считаю, что следующая строка является источником моей проблемы:
$ret[$i] = $dto->modify('+' . $i . ' days')->format('Y-m-d');
Когда я указываю статические значения, код работает.
Любые предложения или идеи будут оценены.
Спасибо
В строке ниже вместо $ я использую только 1.
Ваша линия
$ret[$i] = $dto->modify('+' . $i . ' days')->format('Y-m-d');
использование
$ret[$i] = $dto->modify('+1 days')->format('Y-m-d');
Причина этого в том, что когда вы используете функцию модификации, она изменяет сам объект даты. Таким образом, если изначально дата была 2016-07-04, то при использовании modify («+ $ i days») [$ i = 1] это будет 2016-07-05, но когда на следующем шаге вы измените («+ $ i days «) [$ i = 2] он будет считаться с 2016-07-05 и даст вам 2016-07-07, и это будет продолжаться.
modify
метод действительно модифицирует $dto
Таким образом, в следующей итерации вы не имеете дело с тем же $dto
значение, как в предыдущей итерации.
Итак, на самом деле это упрощает вашу задачу, так как вы можете просто добавлять 1 день каждый раз:
$ret[$i] = $dto->modify('+1 days')->format('Y-m-d');