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.083 ]
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; ?>
Consulta Amazon! Buscas na Web
Gerenciador para QEMU, em PHP-CLI
Script que captura data e hora do PC
Cria gráficos para monitoramento de consumo de CPU e Memória a partir de arquivos [Atualização].
Cria gráficos para monitoramento de consumo de CPU e Memória a partir de arquivos [Atualização].
Conciliando o uso da ZRAM e SWAP em disco na sua máquina
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Visualizar câmeras IP ONVIF no Linux sem necessidade de instalar aplicativos
Realizar overclock no Miyoo Mini (plus ou normal)
Otimização de memória para máquinas modestas
Unbuntu não atualiza o firmware [RESOLVIDO] (2)
linux mint reconhece microfone de lapela como fone de ouvido sem micro... (0)
Dúvidas sobre a originalidade de conteúdos online (10)
Erro de interface de Rede no Virt Manager dentro Debian 13 KDE (12)