• strtotime() – Pode ajudar?

    by  • August 3, 2006 • PHP

    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:

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

    //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
    Runtime do benchmark: aqui

    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?

    This post is also available in: Inglês

    About

    Rafael Dohms is a PHP Evangelist, Speaker and contributor. He is a very active member of the PHP Community, having helped create and manage two PHP User Groups in Brazil. He shared the lead of PHPSP for 3 wonderful years making a positive mark on the local market. Developer, gamer and lover of code he also hosts Brazil’s first PHP Podcast: PHPSPCast, as well as contributing to well known projects. He moved to the Netherlands in search of new challenges and is now part of the team at WEBclusive, sharing his passion for quality code and working on new awesome ideas with the team. You can always find him at the nearest Community events, speaking, sharing, talking or just learning from the rest.

    http://doh.ms