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: 12.057 ]
Homepage: http://everton3x.github.io
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.
<?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; ?>
Sistema de Boletos e Cobrança Online
Atualizando o Passado: Linux no Lenovo G460 em 2025
aaPanel - Um Painel de Hospedagem Gratuito e Poderoso
O macete do Warsaw no Linux Mint e cia
Um modo leve de ouvir/ver áudio/vídeo da internet em máquinas pererecas
Resolver algumas mensagens de erro do SSH
Instalar módulo de segurança do Banco do Brasil Warsaw do tipo .run
Sem espaço na partição home (1)
O que você está ouvindo agora? [2] (190)
Procrastinação e autossabotagem são problemas muito comuns na sociedad... (5)
warsaw parou de funcionar após atualização do sistema (solução) (10)