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.920 ]
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
Redimensionador de fotos em PHP
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
Criando uma VPC na AWS via CLI
Multifuncional HP imprime mas não digitaliza
Dica básica para escrever um Artigo.
Como Exibir Imagens Aleatórias no Neofetch para Personalizar seu Terminal
Erro na criação de pendrive bootável (0)
Não tô conseguindo baixar nada pelo terminal (4)
Instalação do archlinux no qemu mas nao funciona ja na parte de instal... (0)
UUID da partição efi mudou, multiboot já era...e agora? (10)