2010-07-29 9 views
1

나는이 question을 전에 물어 보았지만 대답을 받아 들였습니다. 그러나 우리 서버의 PHP 버전이 5.2이고 DateTime :: diff()이 작동하지 않습니다.PHP 5.2에서 개월 수를 계산하는 방법은 무엇입니까?

생년월일과 주어진 날짜를 사용하여 개월 수와 일 수를 계산하고 싶습니다.

날짜 형식 입력 : Ymd 일수 (예 : 1986년 8월 23일)

출력 :

5 months and 20 days old. 
150 months and 4 days old. 
285 months and 30 days old. 

감사

답변

5

다음은 윤년을 포함하여 월 수와 일 수를 정확하게 결정하는 솔루션입니다. 7 월 21 일부터 8 월 21 일까지는 1 개월 0 일이 아니라 1 개월 1 일이고 3 월 21 일부터 4 월 20 일까지는 1 개월 0 일이 아니라 0 개월 30 일이라고 가정합니다. 후자는 두 경우 모두 월을 계산하기 위해 30으로 곧바로 나누기 만하면 발생합니다.

나는 기능을 최적화 할 수있는 더 좋은 방법이있을거야,하지만 일을 가져옵니다

function diff_date($start_date, $end_date) { 
    list($start_year, $start_month, $start_day) = explode('-', $start_date); 
    list($end_year, $end_month, $end_day) = explode('-', $end_date); 

    $month_diff = $end_month - $start_month; 
    $day_diff = $end_day - $start_day; 

    $months = $month_diff + ($end_year - $start_year) * 12; 
    $days = 0; 

    if ($day_diff > 0) { 
    $days = $day_diff; 
    } 
    else if ($day_diff < 0) { 
    $days = $end_day; 
    $months--; 

    if ($month_diff > 0) { 
     $days += 30 - $start_day; 

     if (in_array($start_month, array(1, 3, 5, 7, 8, 10, 12))) { 
     $days++; 
     } 
     else if ($start_month == 2) { 
     if (($start_year % 4 == 0 && $start_year % 100 != 0) || $start_year % 400 == 0) { 
      $days--; 
     } 
     else { 
      $days -= 2; 
     } 
     } 

     if (in_array($end_month - 1, array(1, 3, 5, 7, 8, 10, 12))) { 
     $days++; 
     } 
     else if ($end_month - 1 == 2) { 
     if (($end_year % 4 == 0 && $end_year % 100 != 0) || $end_year % 400 == 0) { 
      $days--; 
     } 
     else { 
      $days -= 2; 
     } 
     } 
    } 
    } 

    return array($months, $days); 
} 

list($months, $days) = diff_date('1984-05-26', '2010-04-29'); 

print $months . ' months and ' . $days . ' days old.'; 

출력 :

314개월 오래된 삼일.


편집 : 나는 코드에서 중복을 제거하는 시도하고, 변수를 이름을 잊어 버렸습니다. 이 기능은 diff_date('2010-06-29', '2011-07-01')에 대해 올바르게 작동합니다.


편집 : 지금 정확하게 31 28/29 일에 달 후 발생하는 최종 개월 동안 작동합니다.

+0

뭔가 잘못되었다고 생각합니다. date_diff ("2010-06-29", "2011-07-01"); "12 Months 2 Days"를 출력해야하지만 "13 Months 2 Days"가 표시됩니다. – NAVEED

+0

수정 됨. 나는 코드를 정리하고 길잃은 변수를 잊어 버리려고했다. –

+0

노력해 주셔서 감사합니다. – NAVEED

0

이 좋아하는 최신의 분석 기능을 사용하여 (strtotime으로, strptime , mktime)를 사용하여 날짜의 유닉스 타임 스탬프를 얻은 다음 간격 ($ now - $ then) ... 그리고 work out how many seconds there are in a month을 사용하여 사람이 몇 개월을 계산했는지 계산합니다 살았다 (부서와 나머지는 당신의 친구 다).

이렇게하면 실생활에 충분히 근접한 수학적으로 정확한 값을 얻을 수 있습니다.

관련 문제