2012-06-07 3 views
3

수정이 :PHP 날짜 시간 - 내가 참조로 전달하는 기능에 DateTime 개체를 수정하기 위해 노력하고있어 참조

<?php 
$date = new DateTime('2012-02-12'); 

for($n1 = 0; $n1 < 10; $n1++) { 
    $date->modify('first day of next month'); 
    setDate($date, 15); 
    echo $date->format('Y-m-d') . "<br />\n"; 
} 

function setDate(&$date, $day) { 
    $date->setDate($date->format('Y'), $date->format('m'), $day); 
} 
?> 

는하지만 결과는 예상과. 이 참조 자료에 뭔가 잘못 됐어?

EDIT : 예상 결과 : 상기 함수 2012-03-15 2012-04-15 ...

결과 : 2012-03-01 2012-04-01 ..

+2

귀하의 결과/예상 결과는 무엇입니까? – Nick

+0

나는 그 결과가 항상 그 달의 첫 번째를 보여준다는 것이 문제라고 생각한다. 코드가 다음 달 첫 번째 날짜로 설정 한 다음 날짜를 15 일로 설정해야합니다. 그러나 당신이 날짜를 출력 할 때, 그것은 15 일이 아니라 처음입니다. 다음 달 _first 일의 상대 진술을 한 번 사용한 것처럼 보입니다. 그러면 처음에는 _stuck_입니다. setDate를 사용하여 날짜를 변경할 수 없습니다. 월/연도는 변경할 수 있지만 날짜는 변경할 수 없습니다. – Recognizer

+1

날짜가 이미 설정된 후에'DateTime :: setDate'가 작동하지 않는 것 같습니다. 이것은 어디서나 문서화 된 것 같지 않으며 자동으로 실패하는 것 같습니다. 이상한. – lonesomeday

답변

2

PHP는 '둥지 달 첫날'을 좋아하지 않았지만 '+1 개월'을 사용했습니다. 당신이 하루를 절대적으로 설정하고 있기 때문에 처음에는 그 일이 일어나지 않을까 걱정하지 않을 것입니다. 아니면 루프에 들어가기 전에 처음으로 설정할 수 있습니다.

이렇게 나에게 도움이되었다. 나는 new DateTimeZone('America/New_York')을 추가하여 PHP가 설정되지 않았다는 사실을 알려주지 않았다. (공유 서버.) PHP에서 모든 객체가 참조로 전달되었으므로 참조 (&) 비트로 패스를 제거했다.

<?php 
    $date = new DateTime('2012-02-12',new DateTimeZone('America/New_York')); 
    for($n1 = 0; $n1 < 10; $n1++) { 
     $date->modify('+1 month'); 
     setDate($date, 15); 
     echo $date->format('Y-m-d') . "<br />\n"; 
    } 
    function setDate($date, $day) { 
     $date->setDate($date->format('Y'), $date->format('m'), $day); 
    } 
?> 
+0

'다음 달 첫 번째 날'과 같은 것으로 보입니다. 이상한. 코드에서 '+1 개월'로 변경하면 올바른 결과를 얻게됩니다. 이 방법에는 단점이 있습니다. 2012-01-31에 한 달 추가하면 2012-03-02가됩니다. 따라서 함수의 결과는 2012-02-15 대신 2012-03-15가됩니다. 하지만 그것은 함수의 setDate를 1 일에 한 번 호출하고, 1 달을 더한 후 함수 setDate를 15로 다시 호출하는 식으로 작동합니다. – Fabian

2

이미 DateTime 개체에 대한 참조를 전달하고 있습니다. 암시 적으로 DateTime의 인스턴스를 참조로 전달할 필요가 없습니다. DateTime 개체의 복사본이 필요하면 clone 키워드를 사용해야합니다.

그 결과, 모든 순차 월의 15 일을 반복하며 코드를 읽으면 결과가 될 것으로 예상됩니다.

관련 문제