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.927 ]
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; ?>
Monitoramento de Temperatura do Servidor
Fast Template CVS revision 1.2.0
Folha de Ponto, com datas móveis como Carnaval Sexta-Feira Santa e Corpus Christi
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
Arch Linux - Guia para Iniciantes (2)
Problemas ao instalar o PHP (11)
Tem como instalar o gerenciador AMD Adrenalin no Ubuntu 24.04? (15)
Tenho dois Link's ( IP VÁLIDOS ), estou tentando fazer o failover... (0)