out 23 2009

PHP: Usando a Classe DateTime para manipular datas

PHP

Quem em algum momento da vida já precisou trabalhar com datas em PHP, seja comparação ou manipulação, sabe que isso é uma grande dor de cabeça. Não que isso seja difícil de fazer, mas o PHP (até a versão 5.2, pelo menos) não tinha suporte a operações com data. Sempre que era necessário fazer uma verificação se uma data era maior que outra, ou adicionar dias, era uma gambiarra sem fim. E gambiarra é ruim, muito ruim.

Eis que a versão 5.2 do PHP trás uma novidade que acalmou os já saturados nervos de quem necessita desse tipo de controle em seus sistemas. Foram adicionadas ao core do PHP, 4 classes para dar o suporte necessário a manipulação de datas:

Como não tem nenhuma necessidade de replicar a documentação do PHP (que já é bem completa), não vou colocar todos os métodos e atributos que cada classe tem, caso tenha curiosidade (e todo desenvolvedor deve ter), clique nos links e leia a doc de cada uma delas.

Vamos então colocar em prática cada uma dessas classes. Show me the code!

Criando e exibindo uma data formatada

Vamos começar então criando um objeto do tipo DateTime e exibindo ele formatado na tela:

Exemplo 1

//Cria o objeto do tipo DateTime, se não passar
// nada no construtor, assume now;
$date_now = new DateTime();
//usando as constantes da classe DateTime
echo $date_now->format(DATE_RSS);
//mostra Fri, 23 Oct 2009 14:27:51 -0200
  • Linha 3: criamos o objeto sem atribuir nada, com isso, ele assume a data atual(now) do sistema.
  • Linha 5: usamos a função format() utilizando as constantes da classe DateTime

Exemplo 2

//Cria o objeto do tipo DateTime, atribuindo uma string
//usando o formato suportado pela funcao strtotime()
$date_build = new DateTime('2009-10-10');
//usando o formato suportado pela funcao date()
echo $date_build->format('d/m/Y');
//mostra 10/10/2009
  • Linha 3: criamos o objeto atribuindo uma string num formato suportado pela função strtotime()
  • Linha 5: usamos a função format(), mas dessa vez, especificamos o formato da data conforme a função date()

Até agora, nenhuma novidade, já podíamos fazer isso antes até com menos esforço(!?), mas o pulo do gato (não me pergunte de onde tirei esse jargão) ainda está por vir…

Comparação entre datas

Uma outra melhoria que essa classe nos trás é a comparação de datas. Antes, tinhamos um trabalho tremendo para fazer comparação de datas:
Exemplo de POG:

$date1 = str_replace('-','','2009-10-10');
$date2 = str_replace('-','','2009-10-12');
if ($date1 > $date2) {
    //faz algo macabro
}

E isso é chato, e deixa seu código horrível.

Veja como ficou simples fazer a comparação de data usando o DateTime()

Exemplo

$date1 = new DateTime('2009-10-10');
$date2 = new DateTime('2009-12-10');
if ($date1 < $date2) {
    //faz algo de uma maneira correta
}

Sim! A comparação é feita direto entre os objetos, como mágica (brincadeira, é lógica pura)! Isso é uma das features que mais me chamaram a atenção, justamente pela simplicidade do uso. Mas a melhor parte ainda está por vir…

Intervalo entre datas

Eu não me lembro de ter feito isso em PHP (ainda bem) mas calcular o intervalo entre datas também foi facilitado:

$date1 = new DateTime('2009-10-10');
$date2 = new DateTime('2010-10-10');

//calcula a diferenca entre as duas datas
$diff = $date1->diff($date2);

//mostra o numero de dias entre as datas
echo $diff->days . ' dias ';
  • Linha 1 e 2: Cria duas datas do tipo DateTime;
  • Linha 5: O metodo diff() da classe DateTime retorna um objeto do tipo DateInterval;
  • Linha 8: Retorna a quantidade de dias entre as datas

Manipulação de datas

Agora o santo graal em se tratando de datas no PHP, a manipulação de datas, ou seja, poder adicionar/subtrair dias, meses, anos, whatever de uma data:

Exemplo 1

$date1 = new DateTime('2009-10-10');
//imprime 10/10/2009
echo $date1->format('d/m/Y');

//adiciona 1 semana na data
$date1->add(new DateInterval('P1W'));
//imprime 17/10/2009
echo $date1->format('d/m/Y');

//remove 2 dias da data
$date1->sub(new DateInterval('P2D'));
//imprime 15/10/2009
echo $date1->format('d/m/Y');

Tanto o método add() quando o método sub() esperam receber um objeto do tipo DateInterval. O DateInterval cria um intervalo de datas e recebe como parametro, que deve sempre iniciar por “P” (sem as aspas, de Período) seguido pelo periodo, por exemplo P1M (periodo de 1 mês). Na documentação do construtor do objeto tem todas as opções aceitas.

Exemplo 2

Também podemos usar o método modify() para fazer essa manipulação da data.

$date1 = new DateTime('2009-10-10');
//imprime 10/10/2009
echo $date1->format('d/m/Y');

//adiciona 1 semana na data
$date1->modify('+1 week');
//imprime 17/10/2009
echo $date1->format('d/m/Y');

//remove 2 dias da data
$date1->modify('-2 days');
//imprime 15/10/2009
echo $date1->format('d/m/Y');

A diferença é que o método modify() recebe qualquer string aceita no método strtotime(), não necessitando instanciar um objeto DateInterval.

Bueno, por hoje é só pessoal, prometo não demorar tanto no próximo artigo, até porque o PHP 5.3 tem várias novidades muito interessantes. Aguardem…


mai 7 2009

Visualizando sites no Internet Explorer no Ubuntu

ies4linuxJá faz um bom tempo que eu parei de usar o SO desenvolvido pelo pessoal de Redmond. Mesmo assim, ainda passo pela dor de cabeça de ter que validar os sites no bendito Internet Explorer.

Para um usuário Windows, isso deve ser bem fácil (veja bem, deve, pois eu presenciei a tentativa de instalação do IE7 numa máquina windows e não teve santo que fizesse ela funcionar), mas para os desenvolvedores que trabalham em ambiente Linux, a estória não é bem assim.

Existem algumas soluções para fazer isso a partir do Linux, e eu vou compartilhar com vocês aqui as que eu já utilizei e/ou continuo utilizando.

IE4Linux

O IE4Linux é uma ótima ferramenta desenvolvida para Linux que usa o Wine para instalar as versões 5, 5.5, 6 e uma versão beta da engine do IE7

Para instalar essa ferramenta é bem simples.

Primeiro passo
Deve-se ter instalado os pacotes Wine e Cabextract, para isso, suponto que você usa o Ubuntu (no meu caso, a versão 9.04), digite o seguinte comando no terminal:

sudo apt-get install wine cabextract

Feito isso, já tem os pacotes necessários para a instalação do IE4Linux, agora vamos executar os seguintes comandos no terminal:

wget http://www.tatanka.com.br/ies4linux/downloads/ies4linux-latest.tar.gz
tar zxvf ies4linux-latest.tar.gz
cd ies4linux-*
./ies4linux

Agora é o famoso next, next, finish!

Ele deve criar os ícones para acessar o IE, dai é só acessar o site e testar.

Eu ainda uso esta solução, mas tem um porém muito incomodo. Por alguma razão, a aplicação causa um memory leak que acaba por travar a máquina. Bom, wine ou não, ainda é uma aplicação Windows, não dava para esperar alguma coisa diferente.

Máquina Virtual

Essa é outra solução, embora um pouco mais complexa, pois envolve a instalação de uma máquina virtual (no meu caso, quando testei, usei o VirtualBox) e depois a instalação do Windows.

Como essa solução merece um outro post para explica-la, deixo um link que ensina o passo a passo: http://www.tecnoclasta.com/2008/07/03/virtualbox-windowsxp-e-ubuntu-juntos-guia-de-instalacao/

Renderização online

Essa é a solução que venho usando com mais frequencia. Com o advento do IE8, já começo a me preocupar em como ele ira renderizar os projetos.

Para isso, utilizo dois sites:

O primeiro renderiza única e exclusivamente IE, nas versões 5.5, 6, 7 e 8, mas é extremamente rápido para mostrar o screenshot. Já o segundo tem toda uma gama de browsers e de sistemas operacionais também (FF no Windows, no Linux, no Mac, por exemplo), mas tem um problema incomodo, uma fila gigantesca de espera, que por muitas vezes acaba expirando.

Para finalizar

Depois de apresentar essas opções, acredito que deva testa-las e ver com qual você se adapta melhor. Cada uma tem seus pŕos e contras, vai de cada um a melhor.

Eu continuo usando a Renderização Online, pois tento desenvolver os sites de uma maneira a evitar os problemas de renderização. Como nem sempre posso contorná-los, uso esse recurso para ver se está tudo Ok no site.

Por hoje é só pessoal, qualquer dúvida ou crítica, é só deixar um comentário