PHP:在日期范围内(过去2年)循环播放所有周?

时间:2017-01-04 13:23:54

标签: php datetime week-number

我喜欢在产生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);

3 个答案:

答案 0 :(得分:3)

不要试图跟踪边界,而是让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";
}

Demo

答案 1 :(得分:1)

您可以将DateTimesetISODate用于以下内容:

$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");
}

希望这有帮助!

答案 2 :(得分:1)

在Ross Wilson和John Conde的帮助下,我找到了一个解决方案:

$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,本周“属于”仍然包含星期四的那一年。