datetime — PHP: цикл по всем неделям в диапазоне дат (последние 2 года)?

Мне нравится повторять все недели в диапазоне дат, который порождает 2 года. Начиная с номера текущей недели два года назад, до номера текущей недели в этом году.

Проблема в том, что год может иметь 52 недели или 53 недели, например:

  • В 2015 году было 53 недели (53-е было с 2015-12-28 до 2016-01-03)

  • В 2016 году было 52 недели (52-е было с 2016-12-26 по 2017-01-01)

Так что это в настоящее время мой PHP-код:

# start with the current week 2 years ago
$year = date("Y") - 2;
$week = (int) date("W");    // (int) removes leading zero for weeks < 10

$endYear = date("Y");
$endWeek = (int) date("W");

# iterate through all weeks until now
do {
echo $week. " of ". $year;

$week++;
if ($week > 52) { // or greater 53 ?????????????
$year ++;
$week = 1;
}
}
while ($year < $endYear || $week < $endWeek);

0

Решение

Вместо того, чтобы пытаться отслеживать границы, позвольте PHP сделать это за вас.

$start    = new DateTime('-2 years');
$end      = new DateTime();
$interval = new DateInterval('P1W');
$period   = new DatePeriod($start, $interval, $end);
foreach ($period as $date) {
echo $date->format('W') . " of ". $date->format('Y') . "\n";
}

демонстрация

3

Другие решения

Вы могли бы использовать DateTime а также setISODate для чего-то вроде этого:

$now = new DateTime;

$from = (new DateTime)->setISODate($now->format('Y') - 2, $now->format('W'));

while($from < $now) {

echo $from->format('W Y').'<br />';

$from->modify("1 week");
}

Надеюсь это поможет!

1

С помощью Росса Уилсона и Джона Конде я нашел решение:

$now = new DateTime;

$from = (new DateTime)->setISODate($now->format('Y') - 2, $now->format('W'));
$from->modify("thursday this week"); // see ISO 8601

while($from < $now) {
echo $from->format('W Y').'<br />';

$from->modify("+1 week");
}

Поэтому важно установить день недели в четверг, потому что согласно ISO 8601 неделя «принадлежит» тому году, в котором все еще содержится четверг.

1
По вопросам рекламы [email protected]