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

Nova cara!

Nova cara!

  • November 20, 2006

Como podem perceber o blog passou por um “makeover”. O motivo principal foi a busca por mais espaço, com isso este tema que traz duas barras laterais me permite disponibilizar mais conteúdo e ligações com outras áreas do site.

Read More
Of Creating User Groups and Physics

Of Creating User Groups and Physics

  • February 14, 2013

Note: This article was originally published on the october/2011 issue of php-architect .

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