Hoje eu vou falar de um problema que eu vejo muito nos fórums de comunidades de programadores PHP iniciantes. As lendárias operações sobre datas.
Vou listar as funções mais significativas para o nosso problema:
Com estas três funções acima já é possível converter datas de um formato para outro facilmente.
Para exemplificar, eu irei criar um script que, baseado na minha data de nascimento(11/08/1986), converta-a para um formato usado em SGBDs (aaaa-mm-dd). Depois o script irá retornar a minha idade em dias, meses e anos.
Vamos primeiro aprender a converter data do formato mais amigável ao ser humano(dd/mm/aaaa) para o formato utilizado pela maioria dos SGBDs (aaaa-mm-dd). Para isso vamos usar o método explode, para separar os valores de dias, meses e anos, supondo que temos uma string no formato dd/mm/aaaa:
$data = "11/08/1986"; //minha data de nascimento
$vetor = explode("/",$data);
$dias = $vetor[0];
$meses = $vetor[1];
$anos = $vetor[2];
$data_formatada = $anos."-".$meses.'-'.$dias;
No código acima, foi gerado uma string de data no formato aceito pelos campos DATE dos SGBDs.
Para realizar operações entre datas, e desta forma, encontrarmos a diferença entre o dia de hoje e meu nascimento, usaremos o método mktime e o método date, aplicados aos valores de $dias, $meses e $anos obtidos no código acima. E o método date, para obter a data atual.
$dias_atuais = date("d");
$meses_atuais = date("m");
$anos_atuais = date("Y");
$diferenca_segundos = mktime(0,0,0,$meses_atuais - $meses,$dias_atuais-$dias,$anos_atuais-$anos);
$diferenca_minutos = $diferenca_segundos/60;
$diferenca_horas = $diferenca_minutos/60;
Pronto, com o código acima eu encontrei a minha idade em segundo, em minutos e em horas. Com essa mesma lógica é possível encontrar em dias e semanas. Meses e anos é um pouco mais complicado pois necessita de verificar quais meses tem 28, 30 ou 31 dias, e que anos são ou não bissextos.
Vamos deixar este detalhe para um próximo post.
Espero que tenha ajudado.

June 13th, 2007 09:08
Bom post, só uma dica: Pra alterar formato da data seria mais fácil usando a função date com strtotime
ex: date(“Y/m/d”,strtotime(“11/08/1986″));