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.155 ]
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 simples de servidores [versão 1.0]
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?









