Como realizar operações entre duas datas no php, para cálculo de intervalos e idades
Operação com datas é sempre algo complicado. Nesse artigo vou mostrar uma técnica de cálculo de diferença entre duas datas com PHP. Este método de cálculo de diferença entre datas está incluído no pacote Util do Samus Framework, mas pode ser usado em qualquer contexto.
Vamos lá. Na verdade a solução é mais simples do que parece, mas a lógica pode dar um nó na cabeça. Existe um método no php chamado”strtotime” que transforma qualquer string no formato de data (em inglês) em um timestamp válido, e para nossa felicidade o PHP consegue realizar cálculos entre timestamp. Isso mesmo, podemos somar e subtrair datas retornadas por este método.
Uma data é válida quando escrita corretamente no formato universal, aaaa-dd-mm hh:mm:ss; por exemplo: 2009-25-12 13:50:30 ; infelizmente, no Brasil, passamos a vida inteira utilizando a data escrita ao contrário, o que torna estranho esse formato universal (perceba que é muito mais lógico escrever a data iniciando pelo ano, assim as datas são numericamente crescentes).
A função timestamp retorna em segundos a hora atual, com isso conseguimos realizar a operação com as datas. Depois de realizar a operação, basta transformar os segundos em dia, mês, ano ou tempo. Vamos ao método (veja que a assinatura do método é static já que ele utilizado dentro da classe util).
/**
* Calcula o intervalo entre duas datas no formato ISO, o intervalo é dado
* no formato específicado em intevalor q pode ser
* y - ano
* m - meses
* d - dias
* h - horas
* n - minutos
* default ´se gundos
*
* @param string $data1
* @param string $data2
* @param string $intervalo m, d, h, n,y
* @return int|string intervalo de horas
*/
public static function dataDif($data1, $data2, $intervalo) {
switch ($intervalo) {
case 'y':
$Q = 86400*365;
break; //ano
case 'm':
$Q = 2592000;
break; //mes
case 'd':
$Q = 86400;
break; //dia
case 'h':
$Q = 3600;
break; //hora
case 'n':
$Q = 60;
break; //minuto
default:
$Q = 1;
break; //segundo
}
return round((strtotime($data2) - strtotime($data1)) / $Q);
}
Utilizando o método: cálculo de idades:
$nascimento = '1987-07-06';
var_dump(Util::dataDif(date('Y-m-d'), $nascimento, 'y'));
Utilizando o método: cálculo de intervalo de dias:
$evento= '2010-04-24';
var_dump(Util::dataDif(date('Y-m-d'), $evento, 'd'));
Esta é uma implementação simples desta funcionalidade do php, já que não estamos considerando anos bissextos e etc, mas é uma questão de implementação. Existem outras formas de realizar operações com datas, mas essa é uma das que mais gosto.