2016-03-21 4 views
1

Как я могу создать строку различий для чтения, используемую человеком, используя PHP?Как вывести «X лет, Y месяцев и Z дней», используя date_diff?

Примеры:

  • X день (s)
  • X месяц (ев)
  • X день (s) и Y месяц (ев)
  • X год (лет) Y месяц (ов) и Z день (дни)

date_diff, похоже, не поддерживает это, по крайней мере, не в деталях.

ответ

1

Эта функция выполняет две временные метки и преобразует их в формат, который можно прочитать.

  • возвращает только части (года/месяцы/дни), которые являются > 0
  • Он считает, единственным и множественным числом за год (ы), месяц (ев) и день (дни)
  • Он concatinates с «» и „и“, в зависимости от того, сколько элементов отображаются

Примеры:

  • 1 день назад
  • 3 дня назад
  • 1 месяц и 3 дня назад
  • 3 месяца и 1 день назад
  • 1 год и 5 дней назад
  • 2 года, 10 месяцев и 16 дней назад
  • 2 года и 1 день назад

public static function FormatTimeSpan($time1, $time2) 
{ 
    $diff = date_diff(new DateTime(date('Y-m-d H:i:s', $time1)), new DateTime(date('Y-m-d H:i:s', $time2))); 

    $items = [ ]; 
    if ($diff->y > 0) $items[] = $diff->y == 1 ? '1 year' : $diff->y . ' years'; 
    if ($diff->m > 0) $items[] = $diff->m == 1 ? '1 month' : $diff->m . ' months'; 
    if ($diff->d > 0) $items[] = $diff->d == 1 ? '1 day' : $diff->d . ' days'; 
    if (count($items) == 0) $items[] = '0 days'; 

    $last = array_pop($items); 
    return count($items) == 0 ? $last : implode(', ', $items) . ' and ' . $last; 
} 
+0

Спасибо, что поделились своими знаниями. Мне пришлось изменить vars $ time1 на strtotime ($ time1) и $ time2 на strtotime ($ time2). Затем я попробовал несколько дат и получил тот же результат, что и моя функция. Еще раз спасибо! –

0

Я сделал функцию некоторое время назад.

/** 
* Calculate the time between two dates 
* If the second date is not specified it takes the current day 
* @author rsalcedo 
* @param date ("Y-m-d") (aaaa-mm-dd) $from 
* @param date ("Y-m-d") (aaaa-mm-dd) $to 
*/ 
function years_months_days($from,$to="") { 
    try { 
     $myFrom = new DateTime($from); 
     $myAcarreo = 0; 
     if ($to=="" || null) 
      $to=date("Y-m-d"); 
      $myTo = new DateTime($to); 
      $diff_year = $myTo->format("Y") - $myFrom->format("Y") ; 
      $diff_mnth = $myTo->format("m") - $myFrom->format("m") ; 
      $diff_days = $myTo->format("d") - $myFrom->format("d") ; 

      if ($diff_days<0){ 
       $diff_days = $diff_days + 30; 
       $myAcarreo = -1; 
      } 
      $diff_mnth = $diff_mnth + $myAcarreo; 
      $myAcarreo = 0; 
      if ($diff_mnth<0){ 
       $diff_mnth = $diff_mnth + 12; 
       $myAcarreo = -1; 
      } 
      $diff_year = $diff_year + $myAcarreo; 
      return array($diff_year,$diff_mnth,$diff_days); 
    } catch (Exception $e) { 
     echo $e; 
    } 
} 

Вы можете использовать этот способ:

list($edad,$edadMes,$edadDias) = years_months_days("1979-09-12"); 
echo "$edad years, $edadMes months, $edadDias days."; 

list($edad,$edadMes,$edadDias) = years_months_days("1979-09-12","2008-07-18"); 
echo "$edad years, $edadMes months, $edadDias days."; 

Улучшения приветствуются!

+0

Эта функция не вырезает нули. Выходы также могут быть «0 лет, 0 месяцев, 1 день». И он не обрабатывает сингулярное/множественное число. Также предполагается, что в течение 30 дней может быть опасно. – bytecode77

+0

@ bytecode77 Спасибо. –