strtotime() - Pode ajudar?

  • PHP
  • August 3, 2006

Volta e meia recebo emails onde vejo perguntas de “Como somar X dias a uma data?”, “Como descubro quando é a próxima quinta?”, e muitas outras assim. Me assuto ao ver respostas enormes com códigos que fazem de tudo, até calcular dias levando em conta um algoritmo maluco q determina ano bisexto… não entendo porque complicar tanto.

A função strtotime() esta ai para isso, nesse posto vou apresentar ela e mostrar casos simples de uso onde ela é muito eficaz. Além de verificar a performance da função utilizando um benchmark simples.

Qual é o segredo da função strtotime? É simples, a função aceita uma string, no formato “US English date”, e realiza um parse nela transformando em um timestamp. Esta capacidade amplia o horizonte de funcionalidade da strtotime() tornando possivel a soma de datas, obtenção de dias específicos e inumeras outras funcionalidades.

Ela recebe dois parametros, time e now: time - String de acordo com o padrão de datas GNU now - timestamp de referencia

Como usar?

A função pode ser usada somente com o parametro time, mas a presença do parametro now faz com que este data seja o marco de referência da função, vou exemplificar com alguns exemplos:

< ? //Pegar a hora agora echo strtotime("now");

//Usando uma data textual echo strtotime("10 September 2000");

//Adicionar um dia echo strtotime("+1 day");

//Adicionar uma semana echo strtotime("+1 week");

//Adicionar uma semana, dois dias, quatro horas e dois segundos echo strtotime("+1 week 2 days 4 hours 2 seconds");

//Buscar por dia da semana, próxima quinta echo strtotime("next Thursday");

//Buscar por dia da semana, última segunda echo strtotime("last Monday");

//Pegar data de hoje e adicionar 10 dias $now = strtotime("now"); echo strtotime("+10 day",$now);

?>

Vale notar a sintaxe “+3 day” onde o sinal “+” e o número devem estar colados e o “day” (dia) no singular. Isto pode causar alguns transtornos como já apreceram na lista php-pt que participo.

Não sei se isso ajuda muitos, mas realmente é melhor que se entregar a funções que são de certa forma “engessadas” em relação ao formato de entrada da data, ou classes complexas que adicionam dezenas de linhas de codigo.

Vale também resaltar a utilidade desta função na interpretação de data vindas do MySQL Como sabemos, datas do MySQL estão no formato “YYYY-MM-DD”, e para formatar esta data com a função date, strftime ou mktime precisamos fazer um trabalho extensivo de substrings para ajeitar a data. Alás que com esta função podemos fazer isso rapidamente, obeserve: ```php < ? //$data_do_db possui uma data vinda do MySQL echo date(’d/m/Y’.strtotime($data_do_db)); ?>


Na minha cabeça a essa altura só me restava uma reflexão sobre a performance desta função em relação a outras soluções. Por isso primeiro fiz um benchmark eu mesmo e o resultado foi este:

Código: ```php
//Com função $dataInicial = "01/08/2006 08:04:20"; date("d/m/Y H:i:s", dateAdd($dataInicial, +15, "dia"));

//Com strtotime $dataInicial = "01/08/2006 08:04:20"; date("d/m/Y H:i:s", strtotime("+15 day",strtotime($dataInicial)));
``` **Executando 100 vezes Benchmark função: 0.000267641544342 Benchmark strtotime(): 0.000428168773651**

Confesso que não era o que eu esperava, uma diferença de 0.0002 a mais em relação a uma função "custom", por isso fui procurar algo fora do lugar. Me dei conta que partindo da data acima é necessário rodar a função strtotime duas vezes, por isso decidi repetir o teste com um timestamp no lugar da data. Desta vez ficou clara a performance melhor da função strtotime(), pois para transformar o timestamp no formato usado pela função temos que executar a função date primeiro.

**Usando Data textual Executando 100 vezes Benchmark função: 0.000275664329529 Benchmark strtotime(): 0.000425822734833

Usando timestamp Executando 100 vezes Benchmark função: 0.000400955677032 Benchmark strtotime(): 0.000323491096497**

Código do benchmark: [aqui](http://blog.rafaeldohms.com.br/myprojects/codeexamples/bench_strtotime.phps) Runtime do benchmark: [aqui](http://blog.rafaeldohms.com.br/myprojects/codeexamples/bench_strtotime.php)

Bem, mesmo com a performance mais baixa no caso da data textual, que se deve ao processo de parse da string, a facilidade no uso da função é claramente superior, simplificando o código e diminuindo o numero de linhas de código.

Fica entao para vocês a decisão, simplicidade e flexibilidade ou formato engessado e performance?
Tags:
comments powered by Disqus

Related Posts

PHPNW12 - One Conference, so much good stuff

PHPNW12 - One Conference, so much good stuff

  • October 10, 2012

This year I spent more time replying “I don’t know yet” to people who were asking if I was going to PHPNW12 then I did submitting to conferences.

Read More
Widget: BlogBlogs.com.br - Favoritos

Widget: BlogBlogs.com.br - Favoritos

  • August 26, 2006

Com a publicação da API pública do BlogBlogs se tornou possível desenvolver plugins para utilizar os dados de lá em seus blogs, com este widget você poderá listar em sua página uma lista dos seus favoritos (do site BlogBlogs.com.br), sincronizada com qualquer atualização que for feita.

Read More
Sou ZCE!

Sou ZCE!

  • October 2, 2008

Compartilhando com vocês leitores minha alegria, como resultado da ZendCon tirei minha certificação da Zend.

Read More