2012-05-28 4 views
3

Я пытаюсь преобразовать разницу между двумя датами в общее количество лет, сейчас я использую это: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 года и пять месяцев

и так далее ..

Спасибо!

+2

Что это будет выглядеть с 11 месяцев? –

+0

Ну, я чувствую себя довольно глупо сейчас ... Я понятия не имею. Может быть, обработать результат округлить, если десятичная = 10? Мне не нужна такая точность. –

+1

Хорошо ответ, отправленный @Matthew, охватывает оба случая. Если вы, как ни странно, хотите, чтобы 11 месяцев составляли 0,11, то после его нижнего примера. Если вы хотите, чтобы это было нечто очень близкое к 1, ~ 0.93, то следуйте примеру сверху. Это, однако, потеряет ваши хорошие 9 месяцев = 0,9, где 9 месяцев составят 0,75. Это будет иметь большее значение математически, и это то, что я рекомендую. –

ответ

5

Если вы не заботитесь о совершенной точности:

return $interval->days/365; 

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

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

+0

Фантастический, $ interval-> y. '' , $ interval-> m сделал это. Каким-то образом это странно, но это то, что мне нужно прямо сейчас, большое спасибо Мэтью! –

1

Здесь вы можете увидеть функцию, которая делает именно то, что и со многими вариантами: 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 ;-) */ 
?> 

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

+0

Не совсем точный в отношении лет и месяцев. Лучше использовать $ diff-> days вместо $ diff-> y * 365.25 + $ diff-> m * 30 + $ diff-> d – besimple

+0

Ваши дни (случай «d») неверны. Минуты на час выказывают не день. последняя часть должна быть $ diff-> i/1440. Примечание 1440 составляет 24 * 60 – ds00424

0

Simpler и более точный интервал конвертер дней/часов/минут/секунд:

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 
Смежные вопросы