2017-01-04 12 views
0

저는 2 년 동안 생성되는 기간 동안 모든 주를 반복하고 싶습니다. 2 년 전 현재 주 번호에서 시작하여 올해 현재 주 번호까지. PHP : 날짜 범위 (지난 2 년)의 모든 주가 반복됩니까?

  • 2015

    합니다 (53th이 2016년 1월 3일까지 2015년 12월 28일 출신) 53주을했다 :

    문제는 올해 예를 들어 52 주 53주을, 하나를 가질 수 있다는 것입니다

    :
  • 2016

    합니다 (52 번째가 2017년 1월 1일까지 2016년 12월 26일 출신)

그래서이 현재 나의 PHP 코드 52 주했다

# 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

나는 왜 내가 downvoted되었는지 알고 싶습니다, 그래서 나는이 지역 사회에 더 좋은 회원이 될 수 있습니다. –

답변

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

+0

솔루션에 Ross 솔루션과 유사한 버그가 있습니다. "52 of 2015", "53 of 2016", "01 of 2016"... –

+0

ISO 표준에 따르면 53 주 년 –

+0

ISO 8601에 따라 주간이 목요일을 포함하는 연도에 "속하기"때문에 주중 일을 목요일로 설정하는 것이 중요합니다. –

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

희망이 도움이! 로스 윌슨과 존 콘데 I의 도움으로

+0

당신의 솔루션은 좋아 보이지만, "01 2014", "02 2015", ... 그래서 2014 년 53 주가 2015 년 1 월이기 때문에 "01 2014" –

+0

예, 2015 년 첫 주가 실제로 2014 년에 시작되었으므로 –

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에 따르면, 주 년에 "속"때문에 그래서, 목요일에 요일을 설정 목요일은 여전히 ​​포함되어 있습니다.