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.188 ]
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;
?>
Install PHP8, 8.2, 8.3 no Deepin 23
Backup de arquivos na Cloud com AWS Amazon S3 e PHP
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









