Cron - Classe PHP para cálculo da diferença entre duas datas

Publicado por EVERTON DA ROSA (última atualização em 05/05/2010)

[ Hits: 11.906 ]

Homepage: http://everton3x.github.io

Download cron.inc.php




Cron é uma classe PHP que calcula a diferença entre duas datas (dia, mês, ano, horas, minutos, segundos) e retorna um texto informando quanto tempo decorreu entre as datas informadas. Pode ser utilizado com timestamp ou com datas em diversos formatos. Na versão 1.0, suporta os formatos dd/mm/aaaa, dd/mm/aa, dd-mm-aaaa e dd-mm-aa, mas pode receber facilmente outros formatos.

Você pode configurar facilmente quais as unidades de tempo que deseja receber na saída: anos, meses, dias, horas, minutos, segundos; ou anos, meses, dias; ou horas, minutos, ou outra combinação hierárquica do tempo.

  



Esconder código-fonte

<?php
/*
 * Cron - Classe PHP para calcular diferença entre duas datas
 * @author Everton da Rosa everton3x@gmail.com
 * @licence GPL
 * @version 1.0
*/

class Cron{
   
   /* Propriedades */
   
   public $time = array(//Array indicando a sequencia de avaliação. Para incluir bimestre, trimestre, etc, coloque na ordem numérica certa.
      'ano' => 0
      ,'mes' => 1
      ,'dia' => 2
      ,'hora' => 3
      ,'min' => 4
      ,'seg' => 5
   );
   
   public $singular = array(//Array contendo as palavras dos tempos no singular. A ordem deve corresponder à propriedade $time
      0 => 'ano'
      ,1 => 'mês'
      ,2 => 'dia'
      ,3 => 'hora'
      ,4 => 'minuto'
      ,5 => 'segundo'
   );
   
   public $plural = array(//Idem para o plural
      0 => 'anos'
      ,1 => 'meses'
      ,2 => 'dias'
      ,3 => 'horas'
      ,4 => 'minutos'
      ,5 => 'segundos'
   );
   
   public $seconds = array(//quantidade de segundos de um ano, um mês, etc.
      0 => 31536000
      ,1 => 2592000
      ,2 => 86400
      ,3 => 3600
      ,4 => 60
      ,5 => 1
   );
   
   
   /* Métodos principais */
   public function crono($s,$e,$i = 'ano',$f = 'seg'){//Pega dois timestamps ($s, $e) e retorna a diverença nas unidades máxima e mínima ($i, $f);
      
      //Testando se $s e $e têm valor numérico inteiro
      if(!$this->testTimestamp($s)){
         return false;
      }
      
      if(!$this->testTimestamp($e)){
         return false;
      }
      
      //coloca $s e $e em ordem crescente
      if($e < $s){
         $m = $e;
         $n = $s;
         $s = $m;
         $e = $n;
      }
      
      $w = $e - $s;//Calcula a diferença em segundos
      $inicio = $this->time[$i];//Define o código do limite superior
      $fim = $this->time[$f];//Idem para o limite inferior
      
      for($i = $inicio;$i <= $fim;$i++){//Inicia o loop entre os limites superior e inferior das unidades de tempo
         switch($i) {
            case 0://Calcula os anos
               $x = $w/$this->seconds[$i];//anos
               $y = floor($x);//anos inteiros
               $z = $x - $y;//fração do ano
               $w = $z * $this->seconds[$i];//fração do ano em segundos
               $anos = $y;
               break;
               
            case 1://Calcula os meses
               $x = $w/$this->seconds[$i];//meses
               $y = floor($x);//meses inteiros
               $z = $x - $y;//fração do mês
               $w = $z * $this->seconds[$i];//fração do mês em segundos
               $meses = $y;
               break;
            case 2://Calculas os dias
               $x = $w/$this->seconds[$i];//dias
               $y = floor($x);//dias inteiros
               $z = $x - $y;//fração do dia
               $w = $z * $this->seconds[$i];//fração do dia em segundos
               $dias = $y;
               break;
            case 3://Calcula as horas
               $x = $w/$this->seconds[$i];//horas
               $y = floor($x);//horas inteiras
               $z = $x - $y;//fração da hora
               $w = $z * $this->seconds[$i];//fração da hora em segundos
               $horas = $y;
               break;
            case 4://Calcula os minutos
               $x = $w/$this->seconds[$i];//minutos
               $y = floor($x);//minutos inteiros
               $z = $x - $y;//fração do minuto
               $w = $z * $this->seconds[$i];//fração do minuto em segundos
               $minutos = $y;
               break;
            case 5://Calcula os segundos
               $x = $w/$this->seconds[$i];//segundos
               $y = floor($x);//segundos inteiros
               $z = $x - $y;//fração do segundo
               $w = $z * $this->seconds[$i];//fração do segundo em segundos
               $segundos = $y;
               break;
         }
      }
            
      $falta = array(//Array para utilizar na montagem do texto retornado
         0 => $anos
         ,1 => $meses
         ,2 => $dias
         ,3 => $horas
         ,4 => $minutos
         ,5 => $segundos
      );
      
      for($i = $inicio; $i <= $fim; $i++){//Loop para montagem do texto de retorno dentro dos limites superior e inferior
         if($falta[$i] < 1){//Se a unidade de tempo (ano, Mẽs, dia, etc) for menor que um não faz nada
            false;
         }elseif($falta[$i] == 1){//Se a unidade de tempo for um, usa o singular
            $texto = $this->singular[$i];
            $return .= $falta[$i] . " " . $texto . ", ";
         }else{//Senão, usa o plural
            $texto = $this->plural[$i];
            $return .= $falta[$i] . " " . $texto . ", ";
         }
      }
      
      return substr(rtrim($return," "),0,-1);//Retorna a mensagem com a diferença
   }
   
   public function getDiff($format,$s,$e,$i = 'ano',$f = 'seg'){//Acha a diferença de tempo, informando o formato da data e as datas ($s, $e) em texto
      $array = array(//Configura os formatos dizendo qual rotina utilizar
         'dd/mm/aa' => 0
         ,'dd/mm/aaaa' => 0
         ,'dd-mm-aa' => 1
         ,'dd-mm-aaaa' => 1
      );
      
      $format = $array[$format];
      
      switch($format){//rotinas que convertem a data passada em timestamp
         case 0:
            $x = explode('/',$s);
            $dia = $x[0];
            $mes = $x[1];
            $ano = $x[2];
            $hora = 0;
            $min = 0;
            $sec = 0;
            $s = mktime($hora,$min,$sec,$mes,$dia,$ano);
            
            $x = explode('/',$e);
            $dia = $x[0];
            $mes = $x[1];
            $ano = $x[2];
            $hora = 0;
            $min = 0;
            $sec = 0;
            $e = mktime($hora,$min,$sec,$mes,$dia,$ano);
            
            break;
         case 1:
            $x = explode('-',$s);
            $dia = $x[0];
            $mes = $x[1];
            $ano = $x[2];
            $hora = 0;
            $min = 0;
            $sec = 0;
            $s = mktime($hora,$min,$sec,$mes,$dia,$ano);
            
            $x = explode('-',$e);
            $dia = $x[0];
            $mes = $x[1];
            $ano = $x[2];
            $hora = 0;
            $min = 0;
            $sec = 0;
            $e = mktime($hora,$min,$sec,$mes,$dia,$ano);
            
            break;
      }
      return $this->crono($s,$e,$i,$f);//Chama o método para achar a diferença
   }
   
   /* Métodos auxiliares */
   public function testTimestamp($timestamp){//Testa se o timestamp é número inteiro
      if(is_int($timestamp)){
         return true;
      }else{
         return false;
      }
   }
}
?>

<?php
//Exemplo de utilização
$cron = new Cron();
$falta = $cron->crono(0,time(),'ano','seg');

echo 'Tempo entre o timestamp 0 e agora: ';
echo $falta;

echo '<br>';

$end = '12-05-1981';
$start = '28-04-2010';

$cron = new Cron();
$falta = $cron->getDiff('dd-mm-aa',$end,$start,'dia','dia');

echo 'Tempo entre 12/05/1981 e 28/04/2010 (também funciona invertendo-se as datas): ';
echo $falta;

?>

Scripts recomendados

Gerando Código de barras no padrão brasileiro compatível com Browsers Linux e Windows

Text4Shell

Valor por extenso - PHP e ZF2

Calsse eveFile: manipulação de arquivos

Previsão do tempo para Porto Alegre/RS


  

Comentários
[1] Comentário enviado por reideer em 05/05/2010 - 08:07h

Gostei, embora eu utilize normalmente o strtotime, o qual eu considero mais simples, para fazer estes calculos.

Uma dica a mais.
é muito interessane utilizar os comentários no estilo java dentro do PHP.

Hoje existem classes do php que utilizam anotations, e também as IDES(netbeans, eclipse, zend) conseguem entender os parametros de entrada e saída, tornando mais fácil, ágil e divertida a programação.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts