Разница между двумя значениями времени PHP в годах, месяцах и днях для версии PHP 5.2

Вперед:

Я просмотрел существующие вопросы/ответы по этому вопросу. Это не двуличный вопрос; Я не могу найти рабочее решение из принятых ответов.

Основные вопросы/ответы, которые я рассмотрел, можно найти здесь: Как рассчитать разницу между двумя датами с помощью PHP?

Что мне нужно:

Расчет разницы между двумя датами, выраженными в годах, месяцах и днях, который работает с версией PHP: 5.2.

<?php
$current_date = date('d-M-Y');
$future_date = '2012-11-01';
?>

Что я пробовал:

  1. Большинство ответов, которые я нахожу в Интернете, кажутся неточными, поскольку они не учитывают високосные годы.
  2. Этот высоко оцененный ответ не будет работать, потому что DateTime->diff() - это php 5.3+.
  3. Этот принятый ответ (т. е. второй блок кода, предназначенный для PHP 5.2) приводит к следующему анализу:

    Массив ( [y] => 25 [m] => 11 [d] => 7 [h] => 3 [i] => 15 [s] => 19 [invert] => 0 [days] => 9473 ) Массив ( [y] => 25 [m] => 11 [d] => 7 [h] => 3 [i] => 15 [s] => 19 [invert] => 1 [days] => 9473 )

Я не могу сказать, неправильно ли я применил код или это просто случай, когда я не знаю, как манипулировать массивом.


person Dominor Novus    schedule 17.10.2012    source источник
comment
Не спрашивайте, что работает с PHP 5.2 на сегодняшний день. Спросите, как изменить версию PHP.   -  person hakre    schedule 18.10.2012
comment
Вам нужна текстовая разница или математическая разница? Если математически, то какие средние значения вы хотите использовать для лет и месяцев?   -  person Alix Axel    schedule 18.10.2012
comment
@AlixAxel - я могу вас неправильно понять, но вот пример желаемого результата: 1 year, 2 months and 3 days.   -  person Dominor Novus    schedule 18.10.2012
comment
@hakre - Понятно. Хотя у меня есть доступ к cPanel/WHM, я предполагаю, что это то, что предоставляет мой хост. Я запущу билет утром в любом случае.   -  person Dominor Novus    schedule 18.10.2012
comment
Да, подчеркните хостера на этом. Это услуга, за которую вы платите.   -  person hakre    schedule 18.10.2012
comment
@hakre - Оказывается, обновление я могу выполнить сам. Я отложу это до этих выходных, когда у меня будет время тщательно проверить все веб-сайты на предмет устаревания, что, как я предполагаю, будет просто случаем проверки (например, CTRL + F) всех документов на предмет устаревших функций в этом списке из руководство: php.net/manual/en/migration53.deprecated.php   -  person Dominor Novus    schedule 18.10.2012
comment
Подумайте о том, чтобы иметь несколько версий PHP параллельно, чтобы вы могли переключаться на более дифференцированные, например. когда возникают проблемы с переходом на PHP 5.3. Таким образом, вы снижаете риск.   -  person hakre    schedule 18.10.2012


Ответы (2)


Вы видели этот комментарий на странице руководства для DateTime::diff()?

person Alix Axel    schedule 17.10.2012
comment
Нет, я не заметил этого комментария в руководстве, но спасибо, что обратили на него мое внимание. Я скопировал функции в свой веб-документ и попытался вызвать первые функции, вставив этот код сразу после него: pastebin.com /twwyET8R - person Dominor Novus; 18.10.2012
comment
Спасибо за редактирование Аликс. Благодаря вашему коду я смог вывести годы, месяцы и дни как отдельные переменные. Учитывает ли ваше быстрое решение високосные годы (или это вообще необходимо)? - person Dominor Novus; 18.10.2012
comment
@DominorNovus: високосные годы просто необходимы для арифметического подхода. Я вычисляю текстовую разницу (ту, которую мы используем, чтобы узнать, сколько нам лет и когда у нас день рождения). - person Alix Axel; 18.10.2012
comment
Спасибо за решение и объяснение. - person Dominor Novus; 18.10.2012
comment
Это решение неверно, так как в месяцах 28, 29, 30 или 31 день. - person Ed Heal; 18.10.2012
comment
@DominorNovus: это неполное. Пожалуйста, отмените это, чтобы я мог удалить его. - person Alix Axel; 18.10.2012
comment
Снято по запросу. Мой вопрос был заблокирован из-за того, что он слишком локализован :-( - person Dominor Novus; 18.10.2012
comment
@DominorNovus: Что касается вашего первого комментария, вы должны сделать var_dump(get_timespan_string(new DateTime($older), new DateTime($newer)));. - person Alix Axel; 18.10.2012
comment
Спасибо за ваше время Аликс. Я собираюсь последовать вашему коллективному совету и перейти на PHP 5.3. - person Dominor Novus; 18.10.2012

Я тоже работал над тем же. Это может сработать! Сначала вам нужно создать даты.

$date1=date_create("2012-03-15");
$date2=date_create("2013-03-15");

Вот руководство для этого! Затем, чтобы найти разницу между датами и распечатать желаемый результат, используйте это!

$dif=date_diff($date1,$date2); //Will calculate the difference between two dates.
$days = $dif->days; //Days
$years = round($age/365); //Converting days to years and rounding them up.
$months = $difference/30; // Converting to months.
echo "Days =>".$days;
echo "Years =>".$years;
echo "Months =>".$months;

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

person Minks    schedule 14.12.2014