Как рассчитать возраст человека в месяцах + дни в PHP 5.2? - PullRequest
1 голос
/ 29 июля 2010

Я задавал этот вопрос раньше и принял ответ, но теперь я обнаружил, что версия php на нашем сервере - 5.2 и DateTime :: diff () не работает на этом.

Я хочу рассчитать возраст человека в месяцах плюс дни, используя дату рождения и данную дату.

Формат ввода даты: Гм (пример: 1986-08-23)

Вывод:

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

Спасибо

Ответы [ 2 ]

5 голосов
/ 29 июля 2010

Вот решение, которое точно определит количество месяцев и количество дней, включая високосные годы. Предполагается, что такие вещи, как 21 июля - 21 августа, составляют 1 месяц 0 дней, а не 1 месяц 1 день, а 21 марта - 20 апреля - 0 месяцев 30 дней, а не 1 месяц 0 дней. Последнее в обоих случаях - это то, что происходит, когда вы просто делите прямое деление на 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 месяцев и 3 дня.


Редактировать: Я пытался избавиться от избыточности в коде и забыл переименовать переменную. Эта функция теперь будет работать правильно для diff_date('2010-06-29', '2011-07-01').


Редактировать: Теперь корректно работает для конечных месяцев, следующих за месяцами с 31 или 28/29 днями.

0 голосов
/ 29 июля 2010

Используйте вашу любимую функцию анализа даты (strtotime, strptime, mktime), чтобы получить метку времени UNIX вне даты, затем интервал ($ now - $ then) ... и затем вычислить, сколько секунднаходятся в месяце и используют его для расчета того, сколько месяцев человек прожил (деление и остаток - ваши друзья).

Это даст вам математически точное значение, которое должно быть достаточно близко к реальномужизнь тоже.

...