Ir para conteúdo
Fórum Script Brasil
  • 0

Diferença entre datas


Romerito

Pergunta

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 />';

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...