2013-07-26 5 views
4

의 마지막 날을 반환하지 : 그것은 대부분의 일을PHP DateInterval 내가 다음 코드를 사용하고 월

public static function getDays($day, $m, $y) { 
    $days = new DatePeriod(
    new DateTime("first $day of $m $y"), 
    DateInterval::createFromDateString('next ' . $day), 
    new DateTime("last day of $m $y") 
); 
    foreach ($days as $day) { 
    $dates[] = $day->format("Y-m-d"); 
    } 
    return $dates; 
} 

. 나는 범위를 지정하고 범위 안쪽에있는 매일의 날짜를 반환합니다.

사용법 :

foreach(General::getDays('friday',$this->_uri[2],$this->_uri[3]) as $date) { 
    var_dump($date); 
} 

7 월 2013 년이 2013 년 7 월 올바른 사 개 결과를 모두 금요일의 반환

: 한 달에

string '2013-07-05' (length=10) 
string '2013-07-12' (length=10) 
string '2013-07-19' (length=10) 
string '2013-07-26' (length=10) 

그러나 마지막 날 경기에인지 내가 (예를 들어, 금요일, 2014 년 1 월 1 일) 반환 된 결과에서 매월 마지막 날을 그리워합니다.

string '2013-05-03' (length=10) 
string '2013-05-10' (length=10) 
string '2013-05-17' (length=10) 
string '2013-05-24' (length=10) 

사람이에 대한 답변이 있습니까 : 금요일 인 물론 31 누락

2013년 5월 결과? 이 클래스에서 DateInterval을 잘못 사용했거나 오류가 있습니까?

+0

제외되는 경우에 DatePeriod::EXCLUDE_START_DATE 옵션을 사용하지 않는

$days = new DatePeriod( new DateTime("first $day of $m $y"), DateInterval::createFromDateString('next ' . $day), new DateTime("last day of $m $y 00:01") ); 

¹을 운이 좋으면 자정이 아닌 "낮과 밤"을 선택하십시오. '<'vs'<='비교로 인해 펑키 한 일이 일어날 수 있습니다. 간단히 DST 문제가있을 수 있다고 생각했지만 그게 잘못된 달입니다 ... – Floris

답변

5

문제는 종료 날짜/시간 자체가 해당 기간에 포함되지 않는다는 것입니다. 즉, DatePeriod 개체는 [$startDate, $endDate) 범위의 날짜/시간을 나타냅니다.

예상되는 결과를 얻으려면 적어도 종료일까지 1 초를 추가해야합니다. 그러나 이제 인색하지 말자 및 전체 분 추가 : 시작 날짜 자체뿐만 아니라 당신이 더 나은 것 궁금

+0

고맙습니다. 그 머리에 못을 박았다. –

관련 문제