2012-04-11 2 views
4
>> $start_dt = new DateTime() 
DateTime::__set_state(array(
    'date' => '2012-04-11 08:34:01', 
    'timezone_type' => 3, 
    'timezone' => 'America/Los_Angeles', 
)) 
>> $end_dt = new DateTime() 
DateTime::__set_state(array(
    'date' => '2012-04-11 08:34:06', 
    'timezone_type' => 3, 
    'timezone' => 'America/Los_Angeles', 
)) 
>> $start_dt->setTimestamp(strtotime('31-Jan-2012')) 
DateTime::__set_state(array(
    'date' => '2012-01-31 00:00:00', 
    'timezone_type' => 3, 
    'timezone' => 'America/Los_Angeles', 
)) 
>> $end_dt->setTimestamp(strtotime('1-Mar-2012')) 
DateTime::__set_state(array(
    'date' => '2012-03-01 00:00:00', 
    'timezone_type' => 3, 
    'timezone' => 'America/Los_Angeles', 
)) 
>> $interval = $start_dt->diff($end_dt) 
DateInterval::__set_state(array(
    'y' => 0, 
    'm' => 0, 
    'd' => 30, 
    'h' => 0, 
    'i' => 0, 
    's' => 0, 
    'invert' => 0, 
    'days' => 30, 
)) 
>> $interval->format('%mm %dd') 
'0m 30d' 

31-Jan-2012에서 1-Mar-2012까지 한 달 이내에 수익이 발생합니다. 출력이 1 개월, 1 일이 될 것으로 기대합니다. 2 월의 날짜 수는 중요하지 않습니다. 이것이 시간 라이브러리를 사용하는 요점입니다. 이러한 것들을 처리해야합니다. WolframAlpha agrees.이것은 PHP의 DateTime : bug에서 버그입니까?

PHP에 버그를 기록해야합니까? 예상대로 작동하도록 해킹/수정/해결 방법이 있습니까?

답변

5

PHP에 버그를 기록해야합니까?

번호

간격의 "달"부분은 시작 날짜의 월 부분이 많은 달에 의해 증가 될 수 있다는 것을 의미한다. PHP에서의 동작은 시작일이 31-Jan-2012이고 월을 증가 (문자 :)하고 올바른 날짜를 수정하면 (PHP가이 작업을 수행함) 02-Mar-2012이 작업 대상 날짜보다 늦은 것입니다.

이것을 증명하려면 시작 날짜를두고 n 개월을 몇 달 추가하여 문제를 확인하십시오.

31-Jan-2012 (Interval) 
02-Mar-2012 (P1M) 
31-Mar-2012 (P2M) 
01-May-2012 (P3M) 
31-May-2012 (P4M) 
01-Jul-2012 (P5M) 

월이 증가되고 유효한 날짜가되도록 조정 된 것을 볼 수 있습니다.

+0

+1이 정확한 답이기 때문에 - 나는 과거에 이런 행동을 보았고,별로 보잘것없는 문서 때문에 이것에 대해 알지 못했습니다. 빛을 비추는 것에 감사드립니다. :) – Jon

6

업데이트 대답

DateTime::diff의이 동작은 예상하지 못한, 그러나 버그 아니다. 간단히 말해서, diff 당신이

$end_ts = strtotime('+$y years +$m months +$d days' /* etc */, $start_ts); 

를 한 경우 원래 종료 날짜를 종료 대응하는 타임 스탬프를 다시 얻을 것이다 년, 월, 일 등 등의 반환합니다.

이러한 추가 작업은 "맹목적으로"수행 된 다음 날짜 수정이 적용됩니다 (예 : 1 월 31 일 + 1 개월은 2 월 31 일, 3 월 2 일 또는 3 월 3 일은 연도에 따라 수정 됨). 이 구체적인 예에서는 salathe가 설명하는 것처럼 한 달조차 추가 할 수 없습니다.

+0

첫 번째 12 월은 간격 ([예제] (http://codepad.viper-7.com/8wgJI2))에서 '10'개월을 보여줍니다. – salathe

+0

@salathe : 이제 알겠습니다. 바쁜 편집이었습니다. – Jon

+0

나는 몇 달과 몇 년이 정해진 일수가 없다고 주장 할 것이다. 몇 달 동안 물어 보면 2 개의 날짜 사이의 * 달력 * 월 수를 계산해야합니다. 몇 년 동안 동일. * 그 * 라이브러리를 사용하는 장점입니다; "객관적인"(읽기 일관성) 일 수를 원하면 두 개의 타임 스탬프를 사용하고 [2629743.83] (https://www.google.ca/search?sourceid=chrome&ie=UTF-8&q)로 나눕니다. = 수 + + 초 + in + a + 달). – mpen

관련 문제