Функция вычисления разницы между датами в годах, месяцах и т.д..

Konstantin

Новичок
Функция вычисления разницы между датами в годах, месяцах и т.д..

Понадобилось мне, уважаемые, заиметь в своём арсенале фунцию, описанную в сабже. Нарисовалось следующее:
PHP:
function diffdate($a,$b)
{ 
	$ca = array();
	$ka = array('years','months','days','hours','minutes','seconds');
	$aa = explode(' ',date('Y n j g i s',$a));
	$ba = explode(' ',date('Y n j g i s',$b));
	foreach($aa as $k=>$v)
		if(($r=$v-$ba[$k])!==0)
			$ca[$ka[$k]] = $r;
	return $ca;
}
На вход отдаём два таймстемпа, на выходе получаем массив. Всё хорошо, всё работает, но.. думается мне, что можно всё это сотворить более элегантно. Какие-нибудь предложения?
 

Wicked

Новичок
все хорошо, все работает:
Array
(
[hours] => 3
[minutes] => -13
[seconds] => -20
)
:)
 

Фанат

oncle terrible
Команда форума
ну, теоретически, можно попробовать использовать unix timestamp, вычтя один из другого и потом прочто отформатировав с помлзью date()

а вообще - вполне нормальная у тебя функция.
 

Wicked

Новичок
имхо, если поступать корректно, то максимальной величиной (из приведенных), которой можно измерять разницу двух дат, является неделя.
Что брать в качестве месяца? 28, 29, 30 или 31 день?
А год - високосный или нет? :)
 

Wicked

Новичок
Хотя, с другой стороны, поскольку обе даты определены, то определены и конкретные месяцы, года, daylight saving-и, и т.д. Так что задача вроде бы должна решаться :) Причем примерно так, как написано в 1-м посте, при условии доработки напильником.
 

leeroy

Новичок
Автор оригинала: Фанат
хороший, кстати, вопрос.
разницу между числами месяца.
ДА Фанат ... Ты гений мысли ... Подосрал и убежал... Тут был пост ... Там ф-я была правильная ... и нахрена было удалять его... Да тут модер явно не в себе и не шарит ничего похоже...
 

Konstantin

Новичок
Исправил строки формата даты (ошибся с регистром символа для дней) и избавился от отрицательных чисел в результатах.
PHP:
function diffdate($a,$b) 
{  
	$ca = array(); 
	$ka = array('years','months','days','hours','minutes','seconds'); 
	$aa = explode(' ',date('Y n j G i s',$a)); 
	$ba = explode(' ',date('Y n j G i s',$b)); 
	foreach($aa as $k=>$v) 
		if(($r=$v-$ba[$k])!==0) 
			$ca[$ka[$k]] = $r<0 ? $r*-1 : $r;
	return $ca; 
}
Вроде всё? :)

-~{}~ 18.06.06 15:58:

Продолжаем совершенствоваться.
PHP:
function diffdate($b,$a) 
{
	if($a<$b) list($a,$b)=array($b,$a);
	$ca = array(); 
	$ka = array('years','months','days','hours','minutes','seconds'); 
	$da = array(0,12,date('t',$a),23,59,59);
	$aa = explode(' ',date('Y n j G i s',$a)); 
	$ba = explode(' ',date('Y n j G i s',$b)); 
	foreach($aa as $k=>$v) 
		if(($r=$v-$ba[$k])<0) 
		{
			$ca[$ka[$k]] = $da[$k]+$r;
			$ca[$ka[$k-1]]--; 
		}
		else
			$ca[$ka[$k]] = $r;
	foreach($ca as $k=>$v)
		if($v==0) unset($ca[$k]);
	return $ca; 
}
Исправлен алгоритм вычисления значений разницы.
 
Сверху