Колко време е минало от дадена дата?

Ето ти една функция по въпроса. Подаваш двете дати и опционално параметър за интервалът, който търсиш "h","d","m","y". Ако не подадеш интервал ти връща масив с всички разлики.

PHP:
$date1='2011-12-07 22:00:00';
$date2=date('Y-m-d H:i:s');

$diff = DateDiff($date1,$date2);
echo "From $date1 to now are spent ".$diff['y']." years ,".$diff['m']." months, ".$diff['d']." days and ".$diff['h']." hours.";



PHP:
//			interval - h,d,m,y
function DateDiff($startDate, $endDate, $interval=false)
{
	$intervals = array('y'=>0,'m'=>0,'d'=>0,'h'=>0);
    $startDate = strtotime($startDate);
    $endDate = strtotime($endDate);
    
    if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0)
        return false;


	if ($startDate != $endDate) {
		if ($startDate > $endDate) {
			$negative=true;
			$ed = $endDate; 
			$endDate = $startDate;
			$startDate = $ed;
		} else {
			$negative=false;
		}
	
	    $intervals['y'] = date('Y', $endDate) - date('Y', $startDate);
	
	    $endMonth = date('m', $endDate);
	    $startMonth = date('m', $startDate);
	
	    $intervals['m'] = $endMonth - $startMonth;
	    if ($intervals['m'] <= 0 or $intervals['y']>0)  
	        $intervals['m'] += 12*$intervals['y'];
	    
	    $intervals['d'] = date('z', $endDate - strtotime('+' . $intervals['m'] . ' ' . (($intervals['m'] == 1) ? 'month' : 'months'), $startDate));
	    $intervals['h'] = floor( ($endDate-$startDate)/60 );
	
		if ($negative) {
			$intervals['h'] = -$intervals['h'];
			$intervals['d'] = -$intervals['d'];
			$intervals['m'] = -$intervals['m'];
			$intervals['y'] = -$intervals['y'];
		}
	}
	
	if ($interval)
    	return $intervals[$interval];
	else
		return array($intervals['y'], $intervals['m'], $intervals['d'], $intervals['h']);
}
 
Код:
//			interval - h,d,m,y

function DateDiff($startDate, $endDate, $interval=false)

{

	$intervals = array('y'=>0,'m'=>0,'d'=>0,'h'=>0);

    $startDate = strtotime($startDate);

    $endDate = strtotime($endDate);

    

    if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0)

        return false;





	if ($startDate != $endDate) {

		if ($startDate > $endDate) {

			$negative=true;

			$ed = $endDate; 

			$endDate = $startDate;

			$startDate = $ed;

		} else {

			$negative=false;

		}

	

	    $intervals['y'] = date('Y', $endDate) - date('Y', $startDate);

	

	    $endMonth = date('m', $endDate);

	    $startMonth = date('m', $startDate);

	

	    $intervals['m'] = $endMonth - $startMonth;

	    if ($intervals['m'] <= 0 or $intervals['y']>0)  

	        $intervals['m'] += 12*$intervals['y'];

	    

	    $intervals['d'] = date('z', $endDate - strtotime('+' . $intervals['m'] . ' ' . (($intervals['m'] == 1) ? 'month' : 'months'), $startDate));

	    $intervals['h'] = floor( ($endDate-$startDate)/60 );

	

		if ($negative) {

			$intervals['h'] = -$intervals['h'];

			$intervals['d'] = -$intervals['d'];

			$intervals['m'] = -$intervals['m'];

			$intervals['y'] = -$intervals['y'];

		}

	}

	

	if ($interval)

    	return $intervals[$interval];

	else

		return array($intervals['y'], $intervals['m'], $intervals['d'], $intervals['h']);

}



$date1='2011-12-07 22:00:00';
$date2=date('Y-m-d H:i:s');

$diff = DateDiff($date1,$date2);
echo "From $date1 to now are spent ".$diff['y']." years ,".$diff['m']." months, ".$diff['d']." days and ".$diff['h']." hours.";

И ми изкарва:
Код:
From 2011-12-07 22:00:00 to now are spent years , months, days and hours.

Неразбирам много от функции и неразбрах за какъв интервал говориш
 
Ако имаш възможност да използваш РНР 5.3 (както локално, така и на сървъра), има много хубав клас за работа с дати:

PHP:
$date1 = '2011-12-07 22:00:00';
$date2 = date('Y-m-d H:i:s');

//създаване на DateTime обект с първата дата
$datetime1 = new DateTime($date1);

//създаване на DateTime обект с втората дата
$datetime2 = new DateTime($date2);

//намиране на интервала между първата и втората дата
$interval = $datetime1->diff($datetime2);

//форматиране на изходната информация
echo $interval->format('%y години, %m месеца, %h часа, %i минути, %s секунди');
 
Сори не съм ти написал примера както трябва:
echo "From $date1 to now are spent ".$diff[0]." years ,".$diff[1]." months, ".$diff[2]." days and ".$diff[3]." hours.";

Между другото можеш да провериш и алтернативата на @exec - тя определено е по-елегантното решение, но не знам дали ще ти пасне.


BorislawBotew каза:
Код:
//			interval - h,d,m,y

function DateDiff($startDate, $endDate, $interval=false)

{

	$intervals = array('y'=>0,'m'=>0,'d'=>0,'h'=>0);

    $startDate = strtotime($startDate);

    $endDate = strtotime($endDate);

    

    if ($startDate === false || $startDate < 0 || $endDate === false || $endDate < 0)

        return false;





	if ($startDate != $endDate) {

		if ($startDate > $endDate) {

			$negative=true;

			$ed = $endDate; 

			$endDate = $startDate;

			$startDate = $ed;

		} else {

			$negative=false;

		}

	

	    $intervals['y'] = date('Y', $endDate) - date('Y', $startDate);

	

	    $endMonth = date('m', $endDate);

	    $startMonth = date('m', $startDate);

	

	    $intervals['m'] = $endMonth - $startMonth;

	    if ($intervals['m'] <= 0 or $intervals['y']>0)  

	        $intervals['m'] += 12*$intervals['y'];

	    

	    $intervals['d'] = date('z', $endDate - strtotime('+' . $intervals['m'] . ' ' . (($intervals['m'] == 1) ? 'month' : 'months'), $startDate));

	    $intervals['h'] = floor( ($endDate-$startDate)/60 );

	

		if ($negative) {

			$intervals['h'] = -$intervals['h'];

			$intervals['d'] = -$intervals['d'];

			$intervals['m'] = -$intervals['m'];

			$intervals['y'] = -$intervals['y'];

		}

	}

	

	if ($interval)

    	return $intervals[$interval];

	else

		return array($intervals['y'], $intervals['m'], $intervals['d'], $intervals['h']);

}



$date1='2011-12-07 22:00:00';
$date2=date('Y-m-d H:i:s');

$diff = DateDiff($date1,$date2);
echo "From $date1 to now are spent ".$diff['y']." years ,".$diff['m']." months, ".$diff['d']." days and ".$diff['h']." hours.";

И ми изкарва:
Код:
From 2011-12-07 22:00:00 to now are spent years , months, days and hours.

Неразбирам много от функции и неразбрах за какъв интервал говориш
 
Искам да пробвам с примера на exec обаче като го направя така:
Код:
$date1 = '2011-12-07 22:00:00';
$date2 = date('Y-m-d H:i:s');
//създаване на DateTime обект с първата дата
$datetime1 = new DateTime($date1);

//създаване на DateTime обект с втората дата
$datetime2 = new DateTime($date2);

//намиране на интервала между първата и втората дата
$interval = $datetime1->diff($datetime2);

//форматиране на изходната информация
echo $interval->format('%y години, %m месеца, %h часа, %i минути, %s секунди');


Начина изглежда по-лесен с готовата функция обаче този ред не ми е ясен
Код:
$interval = $datetime1->diff($datetime2);

И ми дава грешка:
Код:
Fatal error: Call to undefined method DateTime::diff() in ...
 

Back
Горе