2017-11-29 16 views
0

저는 반복 청구 시스템의 반복 날짜 목록을 얻기 위해 DatePeriod를 사용하고 있습니다.유효 기간이 만료 된 날짜의 DatePeriod 재귀

코드 예제 : 출력과

$time = new DateTime(date('Y-m-d', 1496185200)); 
$interval = new DateInterval('P1M'); 
$occ = 3; 
$period = new DatePeriod($time, $interval, $occ); 

foreach($period as $d) 
{ 
    echo $d->format('d/m/Y H:i').'<br>'; 
} 

: 트랜잭션이 31 일에 구입 한 경우

31/05/2017 00:00 
01/07/2017 00:00 
01/08/2017 00:00 
01/09/2017 00:00 

에서, DatePeriod 방법이 더 (다음 유효 기간 1 번째로 7 월 반복합니다 6 월 31 일) 그러나, 나는 8 월 31 일까지 31 일까지 돌아가는 일정을 잡아야한다.

따라서 출력은

31/05/2017 00:00 (June payment) 
01/07/2017 00:00 (July payment) 
31/07/2017 00:00 (August payment) 
31/08/2017 00:00 (September payment) 
01/10/2017 00:00 (October payment) 
31/10/2017 00:00 (November payment) 
01/12/2017 00:00 (December payment) 
31/12/2017 00:00 (January payment) 

지불 날짜가 다음 유효한 날짜인지 확인하는 방법을 계산하는 데 어려움이 있습니다. 날짜가 유효하지 않은 경우 직접 청구와 마찬가지로 일정 날짜 이전에 결제 할 수 없습니다.

+1

을 월이 31 일이면 마지막 날, 그렇지 않으면 다음 달 *의 첫날을 사용하십시오. – jeroen

답변

0

그것은 매우 우아한 해결책 아니지만, 아래의 올바른 출력 제공 : 대신 * 사용과 같은 몇 가지 복잡한 규칙, 당신은 일관되게 달의 마지막 날을 사용하는 경우가 훨씬 쉬울 것

$time = 1490914800; 

    $day = date('j', $time); 
    $month = date('n', $time); 
    $year = date('Y', $time); 

    $i = 1; 
    while($i < 12) 
    { 
     if($month == 12) 
     { 
      $month = 1; 
      $year++; 
     }else{ 
      $month++; 
     } 

     $useDay = $day; 

     if(!checkdate($month, $day, $year)) $useDay = date('t', mktime(0, 0, 0, $month, 1, $year)); 

     $time = mktime(0, 0, 0, $month, $useDay, $year); 

     echo date('d/m/Y', $time).'<bR>'; 
     $i++; 
    }