다음은 윤년을 포함하여 월 수와 일 수를 정확하게 결정하는 솔루션입니다. 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 일에 달 후 발생하는 최종 개월 동안 작동합니다.
뭔가 잘못되었다고 생각합니다. date_diff ("2010-06-29", "2011-07-01"); "12 Months 2 Days"를 출력해야하지만 "13 Months 2 Days"가 표시됩니다. – NAVEED
수정 됨. 나는 코드를 정리하고 길잃은 변수를 잊어 버리려고했다. –
노력해 주셔서 감사합니다. – NAVEED