i aew pessoal, bom tenho visto nos ultimos tempos a galera perguntando muito como pegar a diferença entre datas no php,
bom eu criei isso no inicio do ano(01/2010), e vim aqui compartilhar com vocês, espero que ajude a galera, eu usei ela em alguns casos e
nunca tive problemas, mas qualquer bug coloca aew para resolvermos.
Falow!
TimeStammpDiff.php
/**
* Description of TimeStampDiff
*
* Classe para retornar difernça entre datas, semelhante ao TimeStampDiff do MySql.
*
* @author Rogério Avelino da Silva <avelino_rogerio@yahoo.com.br>
* @category Data
* @version 1.0
* @see 2010-01-04
*/
class TimeStampDiff
{
/**
* É a string da primeira data passado como parametro
* @access protected
* @var string
*/
protected $time = null;
/**
* É a string da segunda data passado como parametro
* @access protected
* @var string
*/
protected $timeDiff = null;
/**
* Vai guardar a primeira data passado como parametro, em segundos
* @access protected
* @var int
*/
protected $timeSegundos;
/**
* Vai guardar a segunda data passado como parametro, em segundos
* @access protected
* @var int
*/
protected $timeSegundosDiff;
/**
* Vai guardar a quantidade de dias bissexto em segundos
* @access protected
* @var int
*/
protected $timeDiffBisSegundos;
/**
* Vai guardar a quantidade de bissextos
* @access protected
* @var int
*/
protected $bissextoD;
/**
* Vai guardar em um array todos os anos bissextos
* @access protected
* @var array
*/
protected $anosBissexto;
/**
* Vai guardar a diferença das datas em anos
* @access protected
* @var int
*/
protected $anosDiff;
/**
* Vai guardar a diferença das datas em meses
* @access protected
* @var int
*/
protected $mesDiff;
/**
* Vai guardar a diferença das datas em semanas
* @access protected
* @var int
*/
protected $semanaDiff;
/**
* Vai guardar a diferença das datas em dias
* @access protected
* @var int
*/
protected $diaDiff;
/**
* Vai guardar a diferença das datas em dias
* @access protected
* @var int
*/
protected $horaDiff;
/**
* Vai guardar a diferença das datas em minutos
* @access protected
* @var int
*/
protected $minutoDiff;
/**
* Vai guardar a diferença das datas em segundos
* @access protected
* @var int
*/
protected $segundoDiff;
const DIAS_ANO = 365;
const SEGUNDOS_DIA = 86400;
const SEGUNDOS_HORA = 3600;
const SEGUNDOS_MINUTO = 60;
/**
* Constructor
* Deve se passar as pelo menos a primeira string no formato YYYY-MM-DD HH:II:SS
* @param String $time
* @param String $timeDiff
*/
public function __construct( $time , $timeDiff = null )
{
if ( !$timeDiff ) $timeDiff = date( 'Y-m-d H:i:s' );
$this->setTime( $time );
$this->setTime( $timeDiff );
$this->setTimesSegundos();
$this->calculaDiff();
}
/**
* getDiffDatas()
* É o método principal que retorna a diferença das datas no formato deseja
* @access protected
* @param string $strTipo
* @return int | array | string
*/
public function getDiffDatas( $strTipo )
{
switch ( strtolower( $strTipo ) )
{
case 'num_anos_bissextos' : return $this->bissextoD;
case 'anos_bissextos' : return $this->anosBissexto;
case 'anos' : return $this->anosDiff;
case 'meses' : return $this->mesDiff;
case 'semanas' : return $this->semanaDiff;
case 'dias' : return $this->diaDiff;
case 'horas' : return $this->horaDiff;
case 'minutos' : return $this->minutoDiff;
case 'segundos' : return $this->segundoDiff;
default :
return "A string passada como parametro ({$strTipo}) não existe! Verifique o método getDiffDatas para ver os parametros aceitos.";
}
}
/**
* setTime()
* verifica se a string passada esta em um formato de data e seta um valor a propriedade
* @access protected
* @throws exceptionclass se a data não estiver no formato vai ser lançada a exceção
* @param string $time
*/
protected function setTime( $time )
{
if ( !$this->isTimeString( $time ) )
{
throw new Exception( "A hora não esta em um formato válido: <b>{$time}</b>" );
}
else
{
( isset( $this->time ) ) ? $this->timeDiff = $time : $this->time = $time;
}
}
/**
* isTimeString()
* verifica se a string passada esta em um formato de data
* @access protected
* @return boolean
*/
protected function isTimeString( $time )
{
return ( preg_match( '/(^\d{4}\-\d{2}\-\d{2}(\s\d{2}\:\d{2}\:\d{2})?$)|(^\d{2}:\d{2}(:\d{2})?$)/' , $time ) ) ? true : false;
}
/**
* setTimesSegundos()
* seta as propriedades timeSegundos, timeSegundosDiff e segundoDiff
* @access protected
*/
protected function setTimesSegundos()
{
$this->timeSegundos = strtotime( $this->time );
$this->timeSegundosDiff = strtotime( $this->timeDiff );
$this->segundoDiff = $this->timeSegundosDiff - $this->timeSegundos;
}
/**
* calculaDiff()
* seta as propriedades: timeDiffBisSegundos, anosBissexto, diaDiff
* bissextoD, anosDiff, mesDiff, semanaDiff, horaDiff e minutoDiff
* @access protected
*/
protected function calculaDiff()
{
$aBissesxto = $this->getBissextoTime();
$this->timeDiffBisSegundos = $aBissesxto[0];
$this->anosBissexto = $aBissesxto[1];
$this->diaDiff = floor( $this->segundoDiff / self::SEGUNDOS_DIA );
$this->bissextoD = floor( $this->timeDiffBisSegundos / self::SEGUNDOS_DIA );
$this->anosDiff = floor( ( $this->diaDiff - $this->bissextoD ) / self::DIAS_ANO );
$this->mesDiff = $this->getMonth();
$this->semanaDiff = floor( $this->diaDiff / 7 );
$this->horaDiff = floor( $this->segundoDiff / self::SEGUNDOS_HORA );
$this->minutoDiff = floor( $this->segundoDiff / self::SEGUNDOS_MINUTO );
}
/**
* getBissextoTime()
* Faz o calculo para saber quais anos são bissextos
* @access protected
* @return retorna um array, o primeiro parametro é a quantidade de dias bissexto
* convertido em segundos e o segundo parametro retorna um array contendo os anos bissextos
*/
protected function getBissextoTime()
{
$iBissexto = 0;
$aAnosBiss = array();
$ano = substr( $this->time , 0 , 4 );
$anoDiff = ( is_numeric( substr( $this->timeDiff , 0 , 4 ) ) ) ? substr( $this->timeDiff , 0 , 4 ) : date( 'Y' );
if ( is_numeric( substr( $ano , 0 , 4 ) ) )
{
while ( $ano <= $anoDiff )
{
if ( ( ( $ano % 4) == 0 && ( $ano % 100 ) != 0 ) || ( $ano % 400 ) == 0 )
{
$iBissexto += self::SEGUNDOS_DIA;
$aAnosBiss[] = $ano;
}
$ano++;
}
}
return array( $iBissexto , $aAnosBiss );
}
/**
* getMonth()
* calcula a diferença das datas
* @access protected
* @return retorna diferença das datas em meses
*/
protected function getMonth()
{
$iAnoIni = (int) substr( $this->time , 0 , 4 );
$iAnoDiff = (int) substr( $this->timeDiff , 0 , 4 );
$iMesIni = (int) substr( $this->time , 5 , 2 );
$iMesDiff = (int) substr( $this->timeDiff , 5 , 2 );
$iDiaIni = (int) substr( $this->time , 8 , 2 );
$iDiaDiff = (int) substr( $this->timeDiff , 8 , 2 );
$iTotMes = 0;
while ( $iAnoIni <= $iAnoDiff )
{
$i = ( $iAnoIni == substr( $this->time , 0 , 4 ) ) ? ( $iMesIni + 1 ) : 1;
for (; $i <= 12; $i++ )
{
if ( $iAnoIni >= $iAnoDiff && $i >= $iMesDiff )
{
if ( $iDiaIni <= $iDiaDiff && ( $iMesIni != $iMesDiff || substr( $this->time , 0 , 4 ) != $iAnoDiff ) ) $iTotMes++;
break;
}
else
{
for ( $j = 1; $j <= 31; $j++ )
{
if ( ( $j + 1 ) > $iDiaIni )
{
$iTotMes++;
break;
}
}
}
}
$iAnoIni++;
}
return $iTotMes;
}
}
Exemplos de uso:
$dataMenor = '1984-02-21 13:21:45';
$dataMaior = '2005-02-21 22:32:56';
$oTimeStampDiff1 = new TimeStampDiff( $dataMenor , $dataMaior );
echo "Diferença entre as datas {$dataMenor} e {$dataMaior}.<br />";
//retorna a diferença em anos
echo "anos: " . $oTimeStampDiff1->getDiffDatas( 'anos' ) . "<br />";
//retorna a diferença em meses
echo "meses: " . $oTimeStampDiff1->getDiffDatas( 'meses' ) . "<br />";
//retorna a diferença em semanas
echo "semanas: " . $oTimeStampDiff1->getDiffDatas( 'semanas' ) . "<br />";
//retorna a diferença em dias
echo "dias: " . $oTimeStampDiff1->getDiffDatas( 'dias' ) . "<br />";
//retorna a diferença em horas
echo "horas: " . $oTimeStampDiff1->getDiffDatas( 'horas' ) . "<br />";
//retorna a diferença em minutos
echo "minutos: " . $oTimeStampDiff1->getDiffDatas( 'minutos' ) . "<br />";
//retorna a diferença em segundos
echo "segundos: " . $oTimeStampDiff1->getDiffDatas( 'segundos' ) . "<br />";
//retorna o numero de dias bissextos
echo "numero de dias bissexto: " . $oTimeStampDiff1->getDiffDatas( 'num_anos_bissextos' ) . "<br />";
//retorna a todos os anos bissextos em um array
$aAnosBissextos = $oTimeStampDiff1->getDiffDatas( 'anos_bissextos' );
//tambem pode usuar um count para saber a quantidade de dias bissextos
echo "numero de dias bissexto: " . count( $aAnosBissextos ) . "<br />";
echo "anos bissextos:" . implode( ',' , $aAnosBissextos );
echo '<hr />';
//tambem pode passar somente as horas
$oTimeStampDiff2 = new TimeStampDiff( '12:00:00' , '17:40:00' );
echo 'Diferença entre 12:00:00 e17:40:00, em horas: ' . $oTimeStampDiff2->getDiffDatas( 'horas' ) . '<br />';
//tambem pode passar no formato YYYY-MM-DD e YYYY-MM-DD HH:II:SS
$oTimeStampDiff3 = new TimeStampDiff( '2010-04-09' , '2010-04-09 12:43:07' );
echo 'Diferença entre 2010-04-09 e 2010-04-09 12:43:07, em minutos: ' . $oTimeStampDiff3->getDiffDatas( 'minutos' ) . '<br />';
//tambem pode passar no formato YYYY-MM-DD e YYYY-MM-DD HH:II:SS
$oTimeStampDiff4 = new TimeStampDiff( '2005-03-12' , '2010-04-09' );
echo 'Diferença enre 2005-03-12 e 2010-04-09 em meses: ' . $oTimeStampDiff4->getDiffDatas( 'meses' ) . '<br />';
//tambem pode passar somente a o primeiro parametro
//o segundo parametro ira assumir como default a data e hora atual.
$oTimeStampDiff5 = new TimeStampDiff( '2010-03-27' );
echo 'Diferença enre 1992-03-27 e a data atual em semanas: ' . $oTimeStampDiff5->getDiffDatas( 'semanas' ) . '<br />';
Pergunta
Romerito
i aew pessoal, bom tenho visto nos ultimos tempos a galera perguntando muito como pegar a diferença entre datas no php,
bom eu criei isso no inicio do ano(01/2010), e vim aqui compartilhar com vocês, espero que ajude a galera, eu usei ela em alguns casos e
nunca tive problemas, mas qualquer bug coloca aew para resolvermos.
Falow!
TimeStammpDiff.php
Exemplos de uso:Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.