Используйте это для устаревшего кода (PHP <5.3). Для актуального решения см. Ответ Юрки ниже
Вы можете использовать strtotime (), чтобы преобразовать две даты в unix-время, а затем вычислить количество секунд между ними. Отсюда довольно легко рассчитать разные периоды времени.
Изменить: Очевидно, предпочтительный способ сделать это, как описано ниже Юркой. Мой код обычно рекомендуется, только если у вас нет PHP 5.3 или выше.
Несколько человек в комментариях указали, что приведенный выше код является лишь приблизительным. Я по-прежнему считаю, что для большинства целей это нормально, поскольку использование диапазона больше для того, чтобы дать представление о том, сколько времени прошло или осталось, а не для обеспечения точности - если вы хотите это сделать, просто выведите дату.
Несмотря на все это, я решил рассмотреть жалобы. Если вам действительно нужен точный диапазон, но у вас нет доступа к PHP 5.3, используйте приведенный ниже код (он также должен работать в PHP 4). Это прямой порт кода, который PHP использует внутренне для вычисления диапазонов, за исключением того, что он не учитывает переход на летнее время. Это означает, что он выключен максимум на час, но за исключением того, что это должно быть правильно.
Если вы используете класс DateTime, вы можете перейти к $ date-> format ('U'), чтобы получить метку времени Unix.
Джон Крам
4
Это неправда, если вам приходится иметь дело с летним / зимним временем. В этом конкретном случае, когда вы настраиваете летнее / зимнее время, один день равен 23 или 25 часам.
Арно
4
Ну, тот же аргумент может быть сделан в течение високосных лет. Это тоже не учитывается. Тем не менее, я не уверен, что вы даже хотите принять это во внимание, так как мы обсуждаем диапазон здесь. Семантика для диапазона несколько отличается от абсолютной даты.
Эмиль Х
9
Эта функция неверна. Это хорошо для приближения, но неверно для точных диапазонов. Например, предполагается, что в месяце 30 дней, то есть разница между днями с 1 февраля по 1 марта будет такой же, как и с 1 июля по 1 августа (независимо от високосного года).
enobrev
1
В PHP ссылочные переменные находятся в сигнатуре функции, а не в вызове. Переместите все свои &подписи.
Пол Тарьян
909
Я предлагаю использовать объекты DateTime и DateInterval.
$date1 =newDateTime("2007-03-24");
$date2 =newDateTime("2009-06-26");
$interval = $date1->diff($date2);
echo "difference ". $interval->y ." years, ". $interval->m." months, ".$interval->d." days ";// shows the total amount of days (not divided into years, months and days like above)
echo "difference ". $interval->days ." days ";
+1 DateTime правильно обрабатывает високосные годы и часовые пояса, и для полки есть хорошая книга: phparch.com/books/…
hakre
3
Есть ли метод, который дает общее количество секунд между двумя DateTimes? (без добавления компонентов, то есть)
potatoe
1
@Panique $ интервал-> дни и $ интервал-> d являются разными мерами. Ваш комментарий выше правильный "показывает общее количество дней (не разделенных на годы, месяцы и дни, как указано выше)"
Юрка
1
@potatoe Вы, вероятно, хотите $date2->format('U') - $date1->format('U').
Пауло Фрейтас
3
обратите внимание, что есть ошибка, когда DateInterval имеет неправильное свойство days ( всегда 6015 ) в Windows с некоторыми версиями PHP: bugs.php.net/bug.php?id=51184 (см. комментарии там для исправления / обходного решения)
Pim Schaaf
73
Лучший способ действий - использовать объекты PHP DateTime(и DateInterval). Каждая дата инкапсулируется в DateTimeобъект, и тогда можно сделать различие между ними:
DateTimeОбъект будет принимать любой формат strtotime()будет. Если требуется еще более конкретный формат даты, DateTime::createFromFormat()его можно использовать для создания DateTimeобъекта.
После того, как оба объекта были созданы, вы отделяете один от другого с помощью DateTime::diff().
$difference = $first_date->diff($second_date);
$differenceтеперь содержит DateIntervalобъект с информацией о разнице. А var_dump()выглядит так:
DateTime()это не функция, это объект, и он существует с PHP 5.2. Убедитесь, что ваш сервер поддерживает это.
Призрак Мадары
2
@SecondRikudo DateTime :: Различаться нужно PHP 5.3.0
PhoneixS
У нас есть проблема, заменить first_date на second_date, и мы получаем тот же результат? Почему бы не сказать 0 дней 0 часов 0 минут 0 секунд или только 0. Пример: 2012-11-30 17:03:30 - 2012-12-21 00:00:00 и 2012-12-21 00:00:00 - 2012-11-30 17:03:30 получить тот же результат.
EgoistDeveloper
Потому что разница дает вам разницу между двумя разами. Разница не равна 0 независимо от того, какая дата наступит позже.
Призрак Мадары
1
Это действительно хороший ответ, поскольку он предоставляет понятную функцию, которая может быть вызвана из любой точки кодовой базы без большого количества временных вызовов. Другие ответы позволяют вам на лету отбрасывать повторяющиеся сообщения, которые касаются симптомов, а не решают проблему ... Единственный элемент, который я добавил (и почти все остальные сообщения не покрывают это), - это множественное число элементов $ interval если больше 1.
И это ужасное решение, если только вы не вынуждены использовать ужасно устаревшую версию PHP ...
rdlowrey
2
Не так сухо . Например, 60 * 60 * 24 повторяется 15 раз. Да здравствует копирование-вставка!
Питер Мортенсен
Как насчет високосных лет? Год не в среднем 365 дней.
Питер Мортенсен
Этот код предполагает, что в среднем месяц составляет 30 дней. Даже если предположить, что год составляет 365 дней, средний месяц составляет 365/12 = 30,42 дня (приблизительно).
Питер Мортенсен
18
Взгляните на следующую ссылку. Это лучший ответ, который я нашел до сих пор .. :)
function dateDiff ($d1, $d2){// Return the number of days between the two dates: return round(abs(strtotime($d1)- strtotime($d2))/86400);}// end function dateDiff
Неважно, какая дата раньше или позже, когда вы передаете параметры даты. Функция использует абсолютное значение PHP ABS (), чтобы всегда возвращать положительное число как количество дней между двумя датами.
Имейте в виду, что количество дней между двумя датами НЕ включает обе даты. Поэтому, если вы ищете количество дней, представленное всеми датами между и включая введенные даты, вам нужно будет добавить один (1) к результату этой функции.
Например, разница (как показано вышеупомянутой функцией) между 2013-02-09 и 2013-02-14 составляет 5. Но количество дней или дат, представленных диапазоном дат 2013-02-09 - 2013-02- 14 - это 6.
Вопрос задал разницу как количество лет, месяцев и дней, а не общее количество дней.
Питер Мортенсен
14
Я голосовал за Jurka «s ответ , как это мой любимый, но у меня есть пре-php.5.3 ...
Я обнаружил, что работаю над аналогичной проблемой - именно так я и пришел к этому вопросу, - но мне просто нужна была разница в часах. Но моя функция решила и эту проблему довольно хорошо, и у меня нет места в моей собственной библиотеке, где бы она не была потеряна и забыта, так что ... надеюсь, это кому-нибудь пригодится.
Я получил оригинальную идею отсюда , которую я модифицировал для своего использования (и я надеюсь, что моя модификация также появится на этой странице).
Вы можете очень легко удалить ненужные интервалы (скажем, «неделя»), удалив их из $aIntervalsмассива, добавив $aExcludeпараметр или просто отфильтровав их при выводе строки.
К сожалению, это не возвращает то же самое, что DateInterval из-за переполнения года / месяца.
Стивен Харрис
2
@StephenHarris: я не проверял это, но, читая код, я уверен, что он должен вернуть тот же результат - при условии, что вы удалите weekиндекс $aIntervals(так как DateDiffникогда его не используете).
Аликс Аксель
Это отличное решение для поиска дат, которые происходят каждый интервал между двумя датами.
промежуточный мозг
14
<?php
$today = strtotime("2011-02-03 00:00:00");
$myBirthDate = strtotime("1964-10-30 00:00:00");
printf("Days since my birthday: ",($today - $myBirthDate)/60/60/24);?>
Вопрос задал разницу как количество лет , месяцев и дней . Это выводит разницу как общее количество дней.
Питер Мортенсен
11
Я не знаю, используете ли вы PHP-фреймворк или нет, но во многих PHP-фреймворках есть библиотеки даты / времени и помощники, которые помогут вам не изобретать велосипед.
Например, CodeIgniter имеет timespan()функцию. Просто введите две метки времени Unix, и он автоматически сгенерирует такой результат:
не похоже на работу. Я получаю дату в начале эры меток времени.
Сирбер
Важно понимать, что вам нужно сделать, $my_t["year"] -= 1970чтобы получить правильное количество лет. Кроме того, необходимо вычесть ваш час разница по Гринвичу , чтобы получить часы правильно. Вам также необходимо вычесть 1 из месяца и даты.
Салман А
6
// If you just want to see the year difference then use this function.// Using the logic I've created you may also create month and day difference// which I did not provide here so you may have the efforts to use your brain.// :)
$date1='2009-01-01';
$date2='2010-01-01';
echo getYearDifference ($date1,$date2);function getYearDifference($date1=strtotime($date1),$date2=strtotime($date2)){
$year =0;while($date2 > $date1 = strtotime('+1 year', $date1)){++$year;}return $year;}
Учитывает ли "strtotime ('+ 1 year', $ date1)" високосные годы?
Питер Мортенсен
6
Это моя функция. Обязательный PHP> = 5.3.4. Он использует класс DateTime. Очень быстро, быстро и может сделать разницу между двумя датами или даже так называемым временем с тех пор.
if(function_exists('grk_Datetime_Since')=== FALSE){function grk_Datetime_Since($From, $To='', $Prefix='', $Suffix=' ago', $Words=array()){# Est-ce qu'on calcul jusqu'à un moment précis ? Probablement pas, on utilise maintenantif(empty($To)=== TRUE){
$To = time();}# On va s'assurer que $From est numériqueif(is_int($From)=== FALSE){
$From = strtotime($From);};# On va s'assurer que $To est numériqueif(is_int($To)=== FALSE){
$To = strtotime($To);}# On a une erreur ?if($From === FALSE OR $From ===-1 OR $To === FALSE OR $To ===-1){return FALSE;}# On va créer deux objets de date
$From =newDateTime(@date('Y-m-d H:i:s', $From),newDateTimeZone('GMT'));
$To =newDateTime(@date('Y-m-d H:i:s', $To),newDateTimeZone('GMT'));# On va calculer la différence entre $From et $Toif(($Diff = $From->diff($To))=== FALSE){return FALSE;}# On va merger le tableau des noms (par défaut, anglais)
$Words = array_merge(array('year'=>'year','years'=>'years','month'=>'month','months'=>'months','week'=>'week','weeks'=>'weeks','day'=>'day','days'=>'days','hour'=>'hour','hours'=>'hours','minute'=>'minute','minutes'=>'minutes','second'=>'second','seconds'=>'seconds'), $Words);# On va créer la chaîne maintenantif($Diff->y >1){
$Text = $Diff->y.' '.$Words['years'];} elseif($Diff->y ==1){
$Text ='1 '.$Words['year'];} elseif($Diff->m >1){
$Text = $Diff->m.' '.$Words['months'];} elseif($Diff->m ==1){
$Text ='1 '.$Words['month'];} elseif($Diff->d >7){
$Text = ceil($Diff->d/7).' '.$Words['weeks'];} elseif($Diff->d ==7){
$Text ='1 '.$Words['week'];} elseif($Diff->d >1){
$Text = $Diff->d.' '.$Words['days'];} elseif($Diff->d ==1){
$Text ='1 '.$Words['day'];} elseif($Diff->h >1){
$Text = $Diff->h.' '.$Words['hours'];} elseif($Diff->h ==1){
$Text ='1 '.$Words['hour'];} elseif($Diff->i >1){
$Text = $Diff->i.' '.$Words['minutes'];} elseif($Diff->i ==1){
$Text ='1 '.$Words['minute'];} elseif($Diff->s >1){
$Text = $Diff->s.' '.$Words['seconds'];}else{
$Text ='1 '.$Words['second'];}return $Prefix.$Text.$Suffix;}}
Это попытается определить, была ли указана временная метка или нет, а также вернет будущие даты / время в виде отрицательных значений:
<?php
function time_diff($start, $end = NULL, $convert_to_timestamp = FALSE){// If $convert_to_timestamp is not explicitly set to TRUE,// check to see if it was accidental:if($convert_to_timestamp ||!is_numeric($start)){// If $convert_to_timestamp is TRUE, convert to timestamp:
$timestamp_start = strtotime($start);}else{// Otherwise, leave it as a timestamp:
$timestamp_start = $start;}// Same as above, but make sure $end has actually been overridden with a non-null,// non-empty, non-numeric value:if(!is_null($end)&&(!empty($end)&&!is_numeric($end))){
$timestamp_end = strtotime($end);}else{// If $end is NULL or empty and non-numeric value, assume the end time desired// is the current time (useful for age, etc):
$timestamp_end = time();}// Regardless, set the start and end times to an integer:
$start_time =(int) $timestamp_start;
$end_time =(int) $timestamp_end;// Assign these values as the params for $then and $now:
$start_time_var ='start_time';
$end_time_var ='end_time';// Use this to determine if the output is positive (time passed) or negative (future):
$pos_neg =1;// If the end time is at a later time than the start time, do the opposite:if($end_time <= $start_time){
$start_time_var ='end_time';
$end_time_var ='start_time';
$pos_neg =-1;}// Convert everything to the proper format, and do some math:
$then =newDateTime(date('Y-m-d H:i:s', $$start_time_var));
$now =newDateTime(date('Y-m-d H:i:s', $$end_time_var));
$years_then = $then->format('Y');
$years_now = $now->format('Y');
$years = $years_now - $years_then;
$months_then = $then->format('m');
$months_now = $now->format('m');
$months = $months_now - $months_then;
$days_then = $then->format('d');
$days_now = $now->format('d');
$days = $days_now - $days_then;
$hours_then = $then->format('H');
$hours_now = $now->format('H');
$hours = $hours_now - $hours_then;
$minutes_then = $then->format('i');
$minutes_now = $now->format('i');
$minutes = $minutes_now - $minutes_then;
$seconds_then = $then->format('s');
$seconds_now = $now->format('s');
$seconds = $seconds_now - $seconds_then;if($seconds <0){
$minutes -=1;
$seconds +=60;}if($minutes <0){
$hours -=1;
$minutes +=60;}if($hours <0){
$days -=1;
$hours +=24;}
$months_last = $months_now -1;if($months_now ==1){
$years_now -=1;
$months_last =12;}// "Thirty days hath September, April, June, and November" ;)if($months_last ==9|| $months_last ==4|| $months_last ==6|| $months_last ==11){
$days_last_month =30;}elseif($months_last ==2){// Factor in leap years:if(($years_now %4)==0){
$days_last_month =29;}else{
$days_last_month =28;}}else{
$days_last_month =31;}if($days <0){
$months -=1;
$days += $days_last_month;}if($months <0){
$years -=1;
$months +=12;}// Finally, multiply each value by either 1 (in which case it will stay the same),// or by -1 (in which case it will become negative, for future dates).// Note: 0 * 1 == 0 * -1 == 0
$out =new stdClass;
$out->years =(int) $years * $pos_neg;
$out->months =(int) $months * $pos_neg;
$out->days =(int) $days * $pos_neg;
$out->hours =(int) $hours * $pos_neg;
$out->minutes =(int) $minutes * $pos_neg;
$out->seconds =(int) $seconds * $pos_neg;return $out;}
«если» дата хранится в MySQL, мне легче вычислить разницу на уровне базы данных ... Затем на основе выходных данных Day, Hour, Min, Sec, анализировать и отображать результаты соответствующим образом ...
Я нашел вашу статью на следующей странице, которая содержит ряд ссылок на PHP вычисления даты и времени в .
Рассчитайте разницу между двумя датами (и временем), используя PHP. На следующей странице представлен ряд различных методов (всего 7) для выполнения вычислений даты / времени с использованием PHP для определения разницы во времени (часы, единицы), днях, месяцах или годах между двумя датами.
Вы также можете использовать следующий код для возврата различий в датах с округлением до $ date1 = $ duedate; // назначить дату исполнения echo $ date2 = date ("Ymd"); // текущая дата $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // возврат в днях
Если вы используете метод пола php вместо ceil, он вернет вам круглую дробь вниз. Пожалуйста, проверьте разницу здесь, иногда, если часовой пояс ваших промежуточных серверов отличается от часового пояса живого сайта, в этом случае вы можете получить другие результаты, поэтому измените условия соответствующим образом.
Поскольку все публикуют примеры кода, вот еще одна версия.
Я хотел, чтобы функция отображала разницу от секунд до лет (всего одна единица). Для периодов более 1 дня я хотел, чтобы ролловер происходил в полночь (понедельник, 10:00, с 9:00, среда 2 дня назад, а не 1). И для периодов более месяца я хотел, чтобы ролловер происходил в один и тот же день месяца (включая 30/31 дневных месяцев и високосных лет).
Вот что я придумал:
/**
* Returns how long ago something happened in the past, showing it
* as n seconds / minutes / hours / days / weeks / months / years ago.
*
* For periods over a day, it rolls over at midnight (so doesn't depend
* on current time of day), and it correctly accounts for month-lengths
* and leap-years (months and years rollover on current day of month).
*
* $param string $timestamp in DateTime format
* $return string description of interval
*/function ago($timestamp){
$then = date_create($timestamp);// for anything over 1 day, make it rollover on midnight
$today = date_create('tomorrow');// ie end of today
$diff = date_diff($then, $today);if($diff->y >0)return $diff->y.' year'.($diff->y>1?'s':'').' ago';if($diff->m >0)return $diff->m.' month'.($diff->m>1?'s':'').' ago';
$diffW = floor($diff->d /7);if($diffW >0)return $diffW.' week'.($diffW>1?'s':'').' ago';if($diff->d >1)return $diff->d.' day'.($diff->d>1?'s':'').' ago';// for anything less than 1 day, base it off 'now'
$now = date_create();
$diff = date_diff($then, $now);if($diff->d >0)return'yesterday';if($diff->h >0)return $diff->h.' hour'.($diff->h>1?'s':'').' ago';if($diff->i >0)return $diff->i.' minute'.($diff->i>1?'s':'').' ago';return $diff->s.' second'.($diff->s==1?'':'s').' ago';}
Этот ответ так же неверен, как и ответ халдонно. Предполагается (случай 10), что в году 365 дней (каждый четвертый год имеет 366 дней (кроме правил 100 лет / 400 лет для григорианского календаря)) и что месяц имеет 30 дней (это примерно 30,42 дня в не високосные годы). Даже с лучшими константами это в среднем правильно, но не обязательно для любых двух конкретных дат.
Питер Мортенсен
3
Очень просто:
<?php
$date1 = date_create("2007-03-24");
echo "Start date: ".$date1->format("Y-m-d")."<br>";
$date2 = date_create("2009-06-26");
echo "End date: ".$date2->format("Y-m-d")."<br>";
$diff = date_diff($date1,$date2);
echo "Difference between start date and end date: ".$diff->format("%y years, %m months and %d days")."<br>";?>
Пожалуйста, проверьте следующую ссылку для деталей:
Он работает две петли; первый имеет дело с относительными интервалами (годами и месяцами) посредством грубой форсировки, а второй вычисляет дополнительные абсолютные интервалы с простой арифметикой (так что это быстрее):
Ответы:
Вы можете использовать strtotime (), чтобы преобразовать две даты в unix-время, а затем вычислить количество секунд между ними. Отсюда довольно легко рассчитать разные периоды времени.
Изменить: Очевидно, предпочтительный способ сделать это, как описано ниже Юркой. Мой код обычно рекомендуется, только если у вас нет PHP 5.3 или выше.
Несколько человек в комментариях указали, что приведенный выше код является лишь приблизительным. Я по-прежнему считаю, что для большинства целей это нормально, поскольку использование диапазона больше для того, чтобы дать представление о том, сколько времени прошло или осталось, а не для обеспечения точности - если вы хотите это сделать, просто выведите дату.
Несмотря на все это, я решил рассмотреть жалобы. Если вам действительно нужен точный диапазон, но у вас нет доступа к PHP 5.3, используйте приведенный ниже код (он также должен работать в PHP 4). Это прямой порт кода, который PHP использует внутренне для вычисления диапазонов, за исключением того, что он не учитывает переход на летнее время. Это означает, что он выключен максимум на час, но за исключением того, что это должно быть правильно.
источник
&
подписи.Я предлагаю использовать объекты DateTime и DateInterval.
читать дальше php DateTime :: руководство по diff
Из руководства:
источник
$date2->format('U') - $date1->format('U')
.Лучший способ действий - использовать объекты PHP
DateTime
(иDateInterval
). Каждая дата инкапсулируется вDateTime
объект, и тогда можно сделать различие между ними:DateTime
Объект будет принимать любой форматstrtotime()
будет. Если требуется еще более конкретный формат даты,DateTime::createFromFormat()
его можно использовать для созданияDateTime
объекта.После того, как оба объекта были созданы, вы отделяете один от другого с помощью
DateTime::diff()
.$difference
теперь содержитDateInterval
объект с информацией о разнице. Аvar_dump()
выглядит так:Чтобы отформатировать
DateInterval
объект, нам нужно проверить каждое значение и исключить его, если оно равно 0:Осталось только вызвать нашу функцию на
$difference
DateInterval
объекте:И мы получаем правильный результат:
Полный код, используемый для достижения цели:
источник
DateTime()
это не функция, это объект, и он существует с PHP 5.2. Убедитесь, что ваш сервер поддерживает это.Посмотреть часы и минуты и секунды ..
источник
Взгляните на следующую ссылку. Это лучший ответ, который я нашел до сих пор .. :)
http://www.bizinfosys.com/php/date-difference.html
источник
Я голосовал за Jurka «s ответ , как это мой любимый, но у меня есть пре-php.5.3 ...
Я обнаружил, что работаю над аналогичной проблемой - именно так я и пришел к этому вопросу, - но мне просто нужна была разница в часах. Но моя функция решила и эту проблему довольно хорошо, и у меня нет места в моей собственной библиотеке, где бы она не была потеряна и забыта, так что ... надеюсь, это кому-нибудь пригодится.
И тест:
И результат:
Я получил оригинальную идею отсюда , которую я модифицировал для своего использования (и я надеюсь, что моя модификация также появится на этой странице).
Вы можете очень легко удалить ненужные интервалы (скажем, «неделя»), удалив их из
$aIntervals
массива, добавив$aExclude
параметр или просто отфильтровав их при выводе строки.источник
week
индекс$aIntervals
(так какDateDiff
никогда его не используете).источник
Я не знаю, используете ли вы PHP-фреймворк или нет, но во многих PHP-фреймворках есть библиотеки даты / времени и помощники, которые помогут вам не изобретать велосипед.
Например, CodeIgniter имеет
timespan()
функцию. Просто введите две метки времени Unix, и он автоматически сгенерирует такой результат:http://codeigniter.com/user_guide/helpers/date_helper.html
источник
Пример использования:
Вывод :
Функция:
источник
У меня есть простая логика для этого:
источник
Вы можете использовать
функция, которая возвращает массив, содержащий все элементы предоставленной даты / времени:
Если даты начала и окончания указаны в строковом формате, используйте
перед приведенным выше кодом
источник
$my_t["year"] -= 1970
чтобы получить правильное количество лет. Кроме того, необходимо вычесть ваш час разница по Гринвичу , чтобы получить часы правильно. Вам также необходимо вычесть 1 из месяца и даты.источник
Это моя функция. Обязательный PHP> = 5.3.4. Он использует класс DateTime. Очень быстро, быстро и может сделать разницу между двумя датами или даже так называемым временем с тех пор.
источник
Я бы предпочел использовать
date_create
иdate_diff
объекты.Код:
Вывод:
Для получения дополнительной информации прочитайте руководство по PHP
date_diff
источник
Это попытается определить, была ли указана временная метка или нет, а также вернет будущие даты / время в виде отрицательных значений:
Пример использования:
Или:
источник
«если» дата хранится в MySQL, мне легче вычислить разницу на уровне базы данных ... Затем на основе выходных данных Day, Hour, Min, Sec, анализировать и отображать результаты соответствующим образом ...
источник
Я нашел вашу статью на следующей странице, которая содержит ряд ссылок на PHP вычисления даты и времени в .
Рассчитайте разницу между двумя датами (и временем), используя PHP. На следующей странице представлен ряд различных методов (всего 7) для выполнения вычислений даты / времени с использованием PHP для определения разницы во времени (часы, единицы), днях, месяцах или годах между двумя датами.
См. PHP Date Time - 7 методов для вычисления разницы между двумя датами .
источник
Вы также можете использовать следующий код для возврата различий в датах с округлением до $ date1 = $ duedate; // назначить дату исполнения echo $ date2 = date ("Ymd"); // текущая дата $ ts1 = strtotime ($ date1); $ ts2 = strtotime ($ date2); $ seconds_diff = $ ts1 - $ ts2; echo $ datediff = ceil (($ seconds_diff / 3600) / 24); // возврат в днях
Если вы используете метод пола php вместо ceil, он вернет вам круглую дробь вниз. Пожалуйста, проверьте разницу здесь, иногда, если часовой пояс ваших промежуточных серверов отличается от часового пояса живого сайта, в этом случае вы можете получить другие результаты, поэтому измените условия соответствующим образом.
источник
источник
вы всегда можете использовать следующую функцию, которая может возвращать возраст в годах и месяцах (т.е. 1 год 4 месяца)
или если вы хотите, чтобы возраст был рассчитан на текущую дату, вы можете использовать
источник
Для версии php> = 5.3: создайте два объекта даты и затем используйте
date_diff()
функцию. Он вернет объект php DateInterval . см документациюисточник
Вот исполняемый код
источник
У меня была та же проблема с PHP 5.2 и я решил ее с MySQL. Может быть не совсем то, что вы ищете, но это поможет, и вернет количество дней:
Более подробная информация здесь http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff
источник
Поскольку все публикуют примеры кода, вот еще одна версия.
Я хотел, чтобы функция отображала разницу от секунд до лет (всего одна единица). Для периодов более 1 дня я хотел, чтобы ролловер происходил в полночь (понедельник, 10:00, с 9:00, среда 2 дня назад, а не 1). И для периодов более месяца я хотел, чтобы ролловер происходил в один и тот же день месяца (включая 30/31 дневных месяцев и високосных лет).
Вот что я придумал:
источник
Некоторое время назад я написал
format_date
функцию, так как она дает много вариантов того, как вы хотите вашу дату :источник
Очень просто:
Пожалуйста, проверьте следующую ссылку для деталей:
PHP: date_diff - Руководство
Обратите внимание, что это для PHP 5.3.0 или выше.
источник
Легкая функция
Используйте как
echo time_difference ($time_1, $time_2, "day");
Вернется как
2 years 8 months 2 days
источник
Попробуйте этот очень простой ответ, используя date_diff () , это проверено.
выход:
источник
Я использую следующую функцию, которую я написал, когда PHP 5.3 (соответственно date_diff ()) недоступен:
источник
DateInterval
это здорово, но есть пара предостережений:Чтобы преодолеть это, я написал следующее (улучшено по сравнению с ответом @enobrev ):
Он работает две петли; первый имеет дело с относительными интервалами (годами и месяцами) посредством грубой форсировки, а второй вычисляет дополнительные абсолютные интервалы с простой арифметикой (так что это быстрее):
источник