Интерпретация интервала дат интервала PHP с точностью до десятичной

Я пытаюсь преобразовать разницу между двумя датами в общий счет года, сейчас я использую это:

$datetime1 = new DateTime('2009-10-11'); $datetime2 = new DateTime('2010-10-10'); $interval = $datetime1->diff($datetime2); return $interval->format('%y'); 

Это возвращает мне int (как 0 за <год, 2 в течение двух лет и т. Д.),

Мне нужно, чтобы результат был десятичным следующим:

0,9 – 9 месяцев

1,2 – 1 год и два месяца

3,5 – 3 года и пять месяцев

и так далее..

Благодаря!

Если вам не нужна идеальная точность:

 return $interval->days / 365; 

Вы также можете сделать что-то вроде return $interval->y + $interval->m / 12 + $interval->d / 365 .

Даже не заметили свое странное десятичное соглашение, пока я не увидел комментарий @ 2unco. Это будет выглядеть так: return $interval->y . '.' . $interval->m return $interval->y . '.' . $interval->m return $interval->y . '.' . $interval->m .

Здесь вы можете увидеть функцию, которая выполняет именно это и со многими параметрами: http://php.net/manual/es/function.date-diff.php#98615

  <?php /* * A mathematical decimal difference between two informed dates * * Author: Sergio Abreu * Website: http://sites.sitesbr.net * * Features: * Automatic conversion on dates informed as string. * Possibility of absolute values (always +) or relative (-/+) */ function s_datediff( $str_interval, $dt_menor, $dt_maior, $relative=false){ if( is_string( $dt_menor)) $dt_menor = date_create( $dt_menor); if( is_string( $dt_maior)) $dt_maior = date_create( $dt_maior); $diff = date_diff( $dt_menor, $dt_maior, ! $relative); switch( $str_interval){ case "y": $total = $diff->y + $diff->m / 12 + $diff->d / 365.25; break; case "m": $total= $diff->y * 12 + $diff->m + $diff->d/30 + $diff->h / 24; break; case "d": $total = $diff->y * 365.25 + $diff->m * 30 + $diff->d + $diff->h/24 + $diff->i / 60; break; case "h": $total = ($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h + $diff->i/60; break; case "i": $total = (($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i + $diff->s/60; break; case "s": $total = ((($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i)*60 + $diff->s; break; } if( $diff->invert) return -1 * $total; else return $total; } /* Enjoy and feedback me ;-) */ ?><?php /* * A mathematical decimal difference between two informed dates * * Author: Sergio Abreu * Website: http://sites.sitesbr.net * * Features: * Automatic conversion on dates informed as string. * Possibility of absolute values (always +) or relative (-/+) */ function s_datediff( $str_interval, $dt_menor, $dt_maior, $relative=false){ if( is_string( $dt_menor)) $dt_menor = date_create( $dt_menor); if( is_string( $dt_maior)) $dt_maior = date_create( $dt_maior); $diff = date_diff( $dt_menor, $dt_maior, ! $relative); switch( $str_interval){ case "y": $total = $diff->y + $diff->m / 12 + $diff->d / 365.25; break; case "m": $total= $diff->y * 12 + $diff->m + $diff->d/30 + $diff->h / 24; break; case "d": $total = $diff->y * 365.25 + $diff->m * 30 + $diff->d + $diff->h/24 + $diff->i / 60; break; case "h": $total = ($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h + $diff->i/60; break; case "i": $total = (($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i + $diff->s/60; break; case "s": $total = ((($diff->y * 365.25 + $diff->m * 30 + $diff->d) * 24 + $diff->h) * 60 + $diff->i)*60 + $diff->s; break; } if( $diff->invert) return -1 * $total; else return $total; } /* Enjoy and feedback me ;-) */ ?> 

Наслаждайтесь!

Упрощенный и более точный преобразователь интервалов в дни / часы / минуты / секунды:

 function DateDiffInterval($sDate1, $sDate2, $sUnit='H') { //subtract $sDate2-$sDate1 and return the difference in $sUnit (Days,Hours,Minutes,Seconds) $nInterval = strtotime($sDate2) - strtotime($sDate1); if ($sUnit=='D') { // days $nInterval = $nInterval/60/60/24; } else if ($sUnit=='H') { // hours $nInterval = $nInterval/60/60; } else if ($sUnit=='M') { // minutes $nInterval = $nInterval/60; } else if ($sUnit=='S') { // seconds } return $nInterval; } //DateDiffInterval