PHP é à quinta-feira – Trabalhar com Datas
Por Pedro Peixoto para o PPLWARE
É impensável viver num mundo em que não existissem datas, em que não tivéssemos um calendário como forma de organização diária, de facto, as datas estão presentes em quase tudo, e como tal é muito comum necessitarmos de as usar nas nossas aplicações PHP.
Sendo conhecido pela sua simplicidade e flexibilidade, o PHP torna muito fácil trabalhar com datas, bastando duas ou três funções para fazer preencher a maioria das necessidades dos programadores.
Esta semana vamos aprender algumas das funções mais simples e importantes para a manipulação de datas em PHP.
Existe uma quantidade enorme de funções para o tratamento de datas em PHP, aqui, vamos aprender apenas as mais simples e importantes. Mais uma vez, o objectivo do artigo é introduzir o leitor num determinado tema PHP, para que depois ele próprio possa explorar e aprofundar os seus conhecimentos sobre esse mesmo tema.
Antes de começar, vamos apenas entender a diferença entre um formato de data legível pelos humanos e o unix timestamp. Convencionámos ao longo dos anos que determinados formatos de representação sugerem um determinado instante ou um dia, um mês, um ano. No entanto, esses formatos são de difícil tratamento, uma vez que obedece a uma estrutura complexa com meses com diferente número de dias, anos com mais ou menos um dia, etc…
Surgiu, assim a necessidade de simplificar a representação de datas, para podermos tratá-las informaticamente. O mais famoso é o Unix timestamp, vulgarmente chamado apenas timestamp, e é também muito fácil de entender, no fundo é um número com a contagem dos segundos desde o dia 1 de Janeiro de 1970 às 00:00:00 sendo este o timestamp 0. Assim se subtrairmos o timestamp de ontem ao 12:00:00 ao de hoje ao 12:00:00, iremos obter o número de segundos que passaram entre os dois instantes, neste caso 86400 (1 dia). Torna-se assim simples a manipulação e o tratamento de datas. De seguida vamos conhecer algumas funções que tornam possível estas manipulações:
Time
Talvez a função mais simples seja a função “time”, esta função não recebe parâmetros pois retorna apenas o timestamp, mas é sem dúvida muito útil, seja em conjunto com outras funções ou mesmo em casos onde necessitamos apenas do timestamp.
echo time(); //mostra o timestamp actual, ou seja os segundos que passaram até agora desde 1 de Janeiro de 1970 |
Strtotime
Esta função permite a conversão de inúmeros formatos de data em timestamp, assim, sempre que temos que tratar uma data (formato humano), esta função é uma grande ajuda. É uma função bastante versátil porque interpreta uma grande diversidade de formatos de data, o que a torna uma das minhas favoritas.
echo strtotime("now"); //devolve o timestamp actual, equivalente a time(); echo strtotime("2011-02-12 07:00:03"); //converte a data no seu timetamp, ou seja, nos segundos que passaram desde 1 de Janeiro de 1970 até ela.
Pode inclusive ser usada para pequenos cálculos:
echo strtotime("+1 day"); //devolve o timestamp de amanhã echo strtotime("+1 week"); //devolve o timestamp da próxima semana echo strtotime("next Thursday"); // devolve o timestamp da próxima quinta echo strtotime("last Monday"); // devolve o timestamp da última segunda |
Todos os cálculos são feitos relativamente à data actual, por isso quando pedimos “strtotime("+1 day");”, é-nos devolvida a data de amanhã. Contudo, esta função permite ainda que lhe seja passado um segundo parâmetro (timestamp) que serve como referência de partida para os cálculos, assim, por exemplo, para o dia 2011/05/12, vamos calcular o seu timestamp:
$timestp=strtotime(“2011/05/12”); |
Agora já colocar este timestamp como referência de cálculo:
echo strtotime("+1 day" , $timestp); //devolve o timestamp de 2011/05/13 echo strtotime("+1 week" , $timestp); //devolve o timestamp da semana seguinte a 2011/05/12 echo strtotime("next Thursday" , $timestp); // devolve o timestamp quinta-feira seguinte ao 2011/05/12 echo strtotime("last Monday" , $timestp); // devolve o timestamp segunda-feira anterior a 2011/05/12 |
Podemos assim usar uma cadeia de “strtotime” de forma a realizar qualquer cálculo necessário. Esta é sem dúvida uma função poderosa.
Date
A função “date” é, em conceito, uma função de formatação de data, mas na prática é muito mais que isso, e em conjunto com as anteriores, torna todas as operações possíveis. Esta função é o contrário da “strtotime” já que permite converter um timestamp em data compreensível pelos humanos, assim:
echo date("Y-m-d H:i:s",strtotime("+1 day”) ); //Devolve a data de amanhã |
O primeiro parâmetro indica o formato, enquanto que o segundo é o timestamp a converter. Existem inúmeros formatos que podem ser usados e que estão disponíveis na página da função. Se não for passado o segundo parâmetro, a função toma como referência o momento actual, vejamos:
echo date("l"); // “l” devolve o dia da semana->”Thursday” echo date("d (l)"); // “d” devolve o dia, “l” devolve o dia da semana, ficaria “19 (Thursday)” echo date("M y"); // “M” devolve a abreviatura do mês, “y” devolve o ano com dois dígitos, ficaria “May 11” echo date("l \\t\h\e jS"); //o caracter “\” permite escrever texto pelo meio do formato, “j” devolve o dia do mês sem zeros, e o S devolve o sufixo ordinal (st, nd, rd or th), ficaria “Thursday the 3rd”. |
Podemos facilmente fazer o echo de um rodapé de copyright recorrendo a esta função:
echo ’copyright ©’ . date("Y"); //copyright ©2011 |
Conclusão
Estas 2 últimas funções possibilitam praticamente todas as operações de datas que sejam necessárias em PHP, depois de um estudo aprofundado de cada uma delas e com um pouco de raciocínio é possível fazer cálculos impressionantes. No entanto existem muitas outras que também merecem atenção. Deixamos referenciadas a date_diff, date_add, mktime, microtime, entre outras também muito importantes.
Sem dúvida que este é um tema bastante abrangente mas as portas estão abertas…
Vocês já conheciam estas funções? Costumam trabalhar muito com elas?
Este artigo tem mais de um ano
Mais um bom tutorial de PHP, simples e fácil de entender para quem está a começar a mexer em PHP.
Continuação de bom trabalho e boas dicas!
Na verdade, o que bagunça a cabeça mesmo sobre data (com o php) é quando ela é trazida do MySQL, por exemplo: com o timestamp. Rs
Ja tive minhas minhas horas de estudo pra por certinho isso!
Otimo post pra quem esta iniciando, ajuda muito.
Excelente..
costumo, no mês passado precisei para somar dias..
e por acaso antes de ontem necessitei de subtrair horas…
é sem dúvidas muito útil…
agora, tenho uma questão.. existe alguma diferença (p.exemplo: em segurança) em fazer uma consulta à base dados desta forma: “$sql = mysql_query (‘SELECT * FROM users’); $dados = mysql_fetch_array” em vez desta: “$sql = ‘SELECT * FROM users’; $resultado = mysql_query ($sql); $dados = mysql_fetch_array ($resultado);
PS: se o pplware precisar de alguns códigos talvez eu possa ajudar, não garanto é que seja a melhor forma de se fazer as coisas..
Boa noite, não é exactamente igual. Só se coloca a query numa variavel para facilitar a leitura e estruturar o código, ou por exemplo usar a query para LOG ou tratamento de erros.
*Boa noite, não! É exactamente igual. (erro na pontuação)
Não faz muito sentido falar em segurança nesse caso, uma vez que não juntas nenhuma variável à query.
isso é no exemplo… na vida real eventualmente meto valores do introduzidos pelo utilizador… mas aí eu verifico as variáveis antes de as colocar nas queries, com as seguintes funções: trim(), stripslashes() e o mysql_real_escape_string(). Isto chega?? ou ainda à mais alguma coisa que possa fazer?
o mysql_real_escape_string() pode ser contornável, podes ver um exemplo em:
http://ilia.ws/archives/103-mysql_real_escape_string-versus-Prepared-Statements.html
http://www.webappsec.org/projects/articles/091007.txt
Se juntas à query valores do utilizador, o ideal seria mesmo usares Prepared Statements. Aí sim podes garantir uma imunidade a SQL Injection.
ok, obrigado
A partir do PHP5 tens uma nova extensão do mysql, o MySQLi.
Para além de ser mais seguro, tem outros recursos bastantes interessantes, como ser orientado a objectos, tem uma nova estrutura de dados.
O MySQLi usa os mais avançados recursos do MySQL.
Ronda um boato que a extensão simples MySQL, irá ser descontinuada no PHP6, portanto é recomendável que comecem a usar o MySQLi ou a migrar para MySQLi.
A strtotime é espectacular! Consegue-se simplificar muito o código usando esta função.
Bom artigo 😉
Deixo uma dica para quem precise de mais qualquer coisa:
http://pear.php.net/package/Date/
http://pear.php.net/package/Calendar/
O PEAR tem boas bibliotecas, não só para datas mas para muitas outras situações.
Neste caso o Date e o Calendar ajudam em cálculos onde seja, por exemplo, preciso iterar sobre o calendário.
Em relação às datas trazidas da base de dados, para a formatar como queremos:
$data = date(“Y.m.d H:i:s”, strtotime($row[‘minha_data’]) );
Abraços,
Pergunto-me o que é que não dá para fazer com PHP. Depois criam-se maus hábitos quando se regressa ao C ou C++ 😛
Excelente dica.
Eu já precisei de trabalhar com datas e as explicações que encontrava pela net eram muito confusas.
Esta artigo explica muito bem estas duas funções, pela simplicidade e pelos exemplos que nos permitem explorar mais estas funções.
Obg pplware
Obrigado FXX! O objectivo é mesmo ser simples e explicar bem! 😉
Boas,
bom artigo Pedro, acho que teria sido também interessante que tivesses falado no mktime….
Por vez é mesmo o ideal para fazer cálculo de datas, mas mesmo assim grande artigo 😉
cumprimentos
Boa noite, obrigado! Referi-a na conclusão, para quem quiser dar uma vista de olhos, mas neste caso não a achei tão relevante como as restantes. Cumprimentos 🙂
Dessa eu não sabia.
Fiquei impressionado
echo strtotime(“+1 day”);
Muito bom. Tutoriais fantástico como sempre.
Vlw!
O método mais correcto de usar horas num site, é ir buscar a hora do servidor.
Mas isso não é o mais complicado ao trabalhar com horas.
O que realmente é complicado, é fazer o switch de conversão das horas em 12 ou 24 horas.
Muita das vezes, o servidor que usamos usa um sistema operativo em inglês, e a configuração da hora que foi feita está em formato 12 horas.
Então, se o site, for um site em português, em Portugal usa-se horas em formato 24 horas, então tem que se fazer a conversão das horas para formato 24 horas.
Neste momento não é nada difícil fazer isto, basta uma pesquisa no Google e encontram muita coisa sobre isso, mas na altura que eu precisei de saber isto, não se encontrava nada, e tive de descobrir sozinho como o fazer.
Relativamente ao tutorial, é algo importante saber.
O controlo das horas num site é importante, seja pelo facto de existir registos de utilizadores, seja pela inserção de dados na BD.
Uma coisa que talvez fosse bastante interessante para os que estão a iniciar a carreira profissional em programação web PHP, era saberem usar sistemas de templates.
É algo que dá bastante liberdade na programação, e deixa os scripts limpos e organizados.
Olá, como posso aceder a uma lista com todos os tutoriais PHP é à quinta-feira?