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

Meetup API Client v1.0.0

Meetup API Client v1.0.0

  • March 29, 2013

I love APIs, but I honestly hate having to deal with signing, auth, and curl inside my controllers or services, which means I end up wrapping all of that into something that provides easy access in my controllers. I also love Meetup.com since it really makes managing User Groups pretty cool, even with some bad UI choices, which is exactly where their API comes in, it allows me to provide a decent interface to their features from my own UG page and do all the communication via API.

Read More
errorHandler: Gerenciando erros

errorHandler: Gerenciando erros

  • January 15, 2007

Projetando um novo sistema, que irá incorporar 5 sub-sistemas, percebi que eu iria precisar de um gerenciamento de erros mais evoluído, e que me fornecesse mais detalhes para lidar com erros encontrados.

Decidi então criar um gerenciador de erros customizado que pudesse gerenciar totalmente os erros do site, tomando as atitudes necessárias quando fosse requisitado. Com ele em etapa de testes agora decidi compartilhar um pouco da experiência.

Read More
PHP Conf' 2007: Novidades e palestra!

PHP Conf' 2007: Novidades e palestra!

  • November 8, 2007

PHP Conf 2007Esta chegando aquela época do ano denovo, no final de novembro será realizado o PHP Conference 2007, assim como foi realizado o 2006 no ano passado. Porém este ano promete ser diferente para mim. Enquanto ano passado fui apenas um congressita, este ano estarei (se nada sair errado) palestrando no evento, sobre AJAX, e representando o PHPDF.

Read More