<p>저는 DateTime 클래스를 많이 사용해 왔으며 최근에 개월 수를 추가할 때 버그라고 생각했던 것을 만났습니다. 약간의 조사 후에 이것이 실제로 버그가 아니며 예상대로 작동한다는 것이 발견되었습니다. 여기에 있는 문서에 따르면: </p>
<인용문>
<p>예제 #2 또는 추가할 때 주의하세요.
개월 빼기</p>
</인용문>
<pre class="brush:php;toolbar:false;"><?php
$date = new DateTime('2000-12-31');
$date->modify('+1개월');
echo $date->format('Y-m-d') .
$date->modify('+1개월');
echo $date->format('Y-m-d') .
?></pre>
<인용문>
<pre class="brush:php;toolbar:false;">위 예제는 다음을 출력합니다:
2001-01-31
2001-03-03</pre>
</인용문>
<p>이것이 버그로 간주되지 않는 이유를 설명할 수 있는 사람이 있습니까? <br /><br />또한 +1개월이 설계된 대로가 아니라 예상대로 작동하도록 이 문제를 해결하는 우아한 솔루션이 있는 사람이 있나요?
이것은 복제본을 생성하지 않고 개체를 직접 수정하기 위해 DateTime 메서드를 완전히 사용하는 또 다른 깔끔한 솔루션입니다.
으아악출력은 다음과 같습니다:
으아악이것이 버그가 아닌 이유:
현재 동작은 정확합니다. 내부적으로 일어나는 일은 다음과 같습니다.
+1 월은 월(원래 1)을 1씩 증가시킵니다. 그러면 날짜가 2010-02-31로 변경됩니다.
2010년 2월은 28일밖에 없었기 때문에 PHP는 자동으로 이 문제를 수정하고 2월 1일부터 계속해서 일수를 계산합니다. 그래서 우리가 얻은 최종 날짜는 3월 3일이었습니다.
원하는 결과를 얻는 방법:
원하는 결과를 얻으려면 다음 달을 수동으로 확인한 후 다음 달의 일수를 추가하면 됩니다.
이 코드를 직접 작성할 수 있기를 바랍니다. 나는 단지 구체적인 단계를 제공할 뿐입니다.
PHP 5.3 접근 방식:
올바른 동작을 얻으려면 PHP 5.3에 도입된 상대 시간 문 "첫 번째 날"을 사용할 수 있습니다. 이 명령문은 "다음 달", "5번째 달" 또는 "+8개월"과 함께 사용하여 지정된 달의 1일로 이동할 수 있습니다. 현재 사용하는 "+1 월" 대신 다음 코드를 사용하여 다음 달의 첫날을 가져올 수 있습니다.
으아아아이 스크립트는 2월을 올바르게 출력합니다. PHP가 다음 달의 첫 번째 날 명령문을 처리하면 다음과 같은 일이 발생합니다.
다음 달은 월(원래 1)을 1씩 증가시킵니다. 그러면 날짜가 2010-02-31로 변경됩니다.
첫번째 날은 날짜의 일수를 1로 설정하여 날짜가 2010-02-01이 됩니다.