Usando a função strtotime para manipular datas
por Rafael Dohms

Um breve análise sobre a função strtotime, que pode ajudar na soma e subtração de datas, além da identificação de dias de forma relativa (ex: próxima sexta). O artigo trata de como e quando usar a função e um benchmark de seu funcionamento.



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


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:

PHP:

<?php
//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:

<?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:

<?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: http://www.rafaeldohms.com.br/myprojects/codeexamples/bench_strtotime.phps
Runtime do benchmark: http://www.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?

Artigo publicado pela primeira vez em: http://www.rafaeldohms.com.br/2006/08/03/strtotime-pode-ajudar/pt/