вернуть разницу двух дат в PHP

Мне нужно сравнить прошлую/будущую дату с текущей датой в PHP и представить разницу в формате «4 часа до» или «2 дня 3 часа до» или «5 часов назад». Опционально в формате «-4h» (что плохо) или «4h» (что хорошо).

Итак, в примере:

x = $expiry_date - $todays_date

Если результат положительный, т.е. $expiry_date - это 4 часа в будущем, x = "4 часа до конца" или "4 часа". Если результат был отрицательным, например «4 часа назад» или «-4 часа».

Любые другие, похожие по звучанию форматы результатов подходят.

Любая помощь, пожалуйста?


person TomaszRykala    schedule 07.08.2013    source источник
comment
Если вы получаете разницу временных меток, то это просто деление на количество секунд в часе, дне и т. Д.   -  person MightyPork    schedule 07.08.2013
comment
Не могли бы вы привести пример, пожалуйста?   -  person TomaszRykala    schedule 07.08.2013
comment
stackoverflow.com/questions/1416697/   -  person Mircea Soaica    schedule 07.08.2013
comment
См. руководство по PHP для 'DataTime::diff()`. Это должно упростить получение часов/минут/любых значений, которые вам нужны. Что касается форматирования с X часов в будущем, вам нужно будет отформатировать строку самостоятельно.   -  person Spudley    schedule 07.08.2013
comment
Да: php.net/manual/en/datetime.diff.php | и bakery.cakephp.org/articles /g2010a/2008/04/12/   -  person MightyPork    schedule 07.08.2013
comment
возможный дубликат Получить нормальную удобочитаемую пользователем дату/время с помощью php   -  person vascowhite    schedule 08.08.2013


Ответы (3)


Обратитесь к разнице дат в PHP

$date1 = "2013-08-11";
$date2 = "2012-07-12";

$diff = abs(strtotime($date2) - strtotime($date1));

$years = floor($diff / (365*60*60*24));
$months = floor(($diff - $years * 365*60*60*24) / (30*60*60*24));
$days = floor(($diff - $years * 365*60*60*24 - $months*30*60*60*24)/ (60*60*24));

printf("%d years, %d months, %d days\n", $years, $months, $days);

Или

$date1 = new DateTime("2007-03-24");
$date2 = new DateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference " . $interval->y . " years, " . $interval->m." months, ".$interval->d." days "; 

//or simply
//echo "difference " . $interval->days . " days ";
person softvar    schedule 07.08.2013
comment
Остерегайтесь использовать такие вычисления, как $time += 24*60*60, для управления временными метками. Это создает проблемы с переходом на летнее время и другими аномалиями часового пояса. Вместо этого используйте такие методы, как $time = strtotime('+1 day', $time). - person ironcito; 07.08.2013
comment
Рад помочь @TomaszRykala :) - person softvar; 09.08.2013

Это можно сделать с помощью библиотеки Carbon. Это будет выглядеть примерно так:

$now = Carbon::now();
$then = Carbon::create(2013, 8, 8, 23, 26, 11);
echo $now->diffForHumans($then);     

Вывод будет удобочитаемой строкой, как и то, что вы ищете.

person ciruvan    schedule 07.08.2013

См. этот вопрос.

Переменная будет содержать разницу в секундах, которую затем можно разделить по мере необходимости, чтобы получить минуты/часы/дни и т. д. Например. разделите на 60, чтобы получить минуты, еще раз на 60, чтобы получить часы и т. д. Затем выполните простую проверку значений для форматирования по мере необходимости.

person Chris Brown    schedule 07.08.2013