Essa é uma explicação simples sobre Datas e Tempos em PHP. Aqui será abordado apenas o objeto DateTime, uma vez que são oferecidas mais possibilidade ao tratar datas e tempos. Inclusive recomendo o uso apenas dele para evitar confusão ao manipular datas no PHP. Evite ao máximo usar funções como date para datas que possar vir a ser alteradas. Show
Familiarizando-se com o Objeto DatetimeObtendo a data atual$data = new Datetime(); echo $data->format('d/m/Y H:i:s'); echo $data->format('d/m/Y');Criando Data a partir de um FormatoÉ possível que em seus sistema, você receba datas em uma determinada formatação (dia/mes/ano , ano/dia/mes, dia/ano/mes, etc). Os exemplos mais comuns de formatos de data são: d/m/Y; m-d-Y; Y-m-d. Selecionando um TimezonePode ser que ao executar o código acima, o horario retornado estava ligeiramente diferente, algo como 3 horas a mais! Isso acontece porque o Timezone está configurado para outra Região. Para corrigir isso: // metodo 1 $data = new DateTime('now', new DateTimeZone('America/Sao_Paulo')); echo $data->format('d/m/Y H:i:s'); // metodo 2 $data = new DateTime(); $data->setTimezone(new DateTimeZone('America/Sao_Paulo')); echo $data->format('d/m/Y H:i:s');Para uma lista dos nomes de Timezones existentes, acesse a documentação do PHP em Lista de Fusos Horários Suportados. Obtendo uma data especificaPara obter uma data especifica é necessário passar um parâmetro quando construir o objeto DateTime. O Parâmetro deve ser um formato válido de data. Para saber todos os formatos aceitos acesse a Documentação do PHP. // Escrita numero 1 $data = new Datetime('2004-12-25'); echo $data->format('d/m/Y'); // Escrita numero 2 $data = new Datetime('20041225'); echo $data->format('d/m/Y'); // Escrita numero 3 $data = new Datetime('25-12-2004'); echo $data->format('d/m/Y'); // Escrita numero 4 $data = new Datetime('2004-12-05 10:39:01'); echo $data->format('d/m/Y');Veja que nos exemplos acima há muitas formas de escrever a mesma data. Manipulando Data e Hora com PHP e DateTime# obtendo a data de Ontem $date = new DateTime(); $date->modify("-1 day"); echo $date->format("Y-m-d H:i:s"); # obtendo a data de 30 dias atrás echo $data->modify("-30 day")->format('d/m/Y'); echo $data->modify("-22 hours")->format('d/m/Y H:i:s');Obtendo o próximo SábadoObter um certo dia da semana é muito útil quando não sabemos em que data ele vai cair. No DateTime é possível modificar a data para uma em especifico usando a escrita em Inglês. $date = new DateTime(); $date->modify('next saturday'); echo $date->format('d/m/Y');Obtendo o Nome do Dia e Mês por extensoSaber o nome do mês ou dia por extenso são informações importantes e facilmente conseguidas via DateTime. Obtendo o Timestamp de um DateTimeO Timestamp é importante principalmente quando há a necessidade de comparar Datas. # pegando data e hora atual $data = new DateTime(); # metodo 1 - exibindo tbm a data formatada echo $data->format('U = Y-m-d H:i:s'); # metodo 2 echo " ".$data->getTimestamp(); # metodo 3 echo " ".$data->format("U");Comparando DateTimeSaber se uma data é maior ou menor que outra é bastante simples. Basta usar um if, uma vez que a comparação será feita entre os timestamps das datas. $data1 = new DateTime('2020-03-04'); $data2 = new DateTime('now'); if ($data1 > $data2) { echo "Data 1 maior que data 2"; } else { echo "Data 2 e' maior do que a data 1"; }ConclusãoEspero que esse pequeno artigo tenha sido esclarecedor. Caso tenha dúvidas, deixe as nos comentários abaixo.
Vou fazer um manual bem detalhado de como trabalhar com datas em PHP. Nesse manual você irá aprender, não só os formatos, mas como comparar as datas, como saber se o ano é bissexto, criar funções, para buscar uma data daqui 1 mês, outra data daqui 1 ano. Tudo de uma maneira simples e fácil e será possível fazer DOWNLOAD do SCRIPT em funções ou apenas uma classe chamada DATA. 1) Formatar data em PHP em PT BRSe tem algo que para todo programador às vezes é complicado é trabalhar com datas em PHP e na verdade é algo extremante simples. O formato de entrada de data no MYSQL é AAAA-MM-DD, por exemplo 2017-02-04, mas como vou colocar no formato DD/MM/AAAA? Essa e outras dúvidas vou esclarecer para vocês. Vou ensinar para vocês como tratar datas em PHP de uma maneira simples. Vou escrever códigos simples em FUNÇÃO e também em CLASSE. Você também poderá fazer DOWNLOAD da classe DATA no meu site. Primeiro vamos entender como funcionam datas em PHP. Nativo do PHP existe a função DATE se eu colocar parâmetros dentro dela ela escreverá a data como eu quiser. Exemplo: Y = em 4 dígitos Abaixo todos parâmetros de data que existem, essa informação foi retirada do site PHP.NET.
Retirado do site PHP.NET os que estão em NEGRITO são os mais utilizados para datas no formato Português do Brasil. Os que iremos usar mais são os formatos que darão entrada no MYSQL e irá te ajudar na programação. Então vamos lá. Campo DATE no MYSQL a entrada tem que ser 2017-02-04, DATETIME a entrada tem que ser 2017-02-04 13:12:18, como seria tudo isso em código data? <? date("Y-m-d") date("Y-m-d H:i:s") ?> Ambos formatos a saída será a acima. Porém para exibição como eu faço? Infelizmente o PHP não tem tradução para o português, mas eu fiz vários Scripts para esse tratamento e vou ensinar aqui para vocês. Atenção para escrever esses scripts abaixo é necessário conhecer ARRAYS e ou MATRIZ, senão conhecer, clique no link das palavras acima para ler e entender o que seria MATRIZ e ou ARRAY. 2) Função para converter formato AAAA-MM-DD para DD/MM/AAAA<?php //converte DD/MM/AAAAA para AAAA-MM-DD function formata_data_banco($data) { //converte data dd/mm/aaaa para aaaa-mm-dd if ($data == "") return null; $corrige = explode("/", $data); $corrige = $corrige[2]."-".$corrige[1]."-".$corrige[0]; return $corrige; } //converte DD/MM/AAAAA para AAAA-MM-DD function formata_data_br($data) { //converte aaaa-mm-dd para dd/mm/aaaa if ($data == "") return ""; $corrige = explode("-",$data); $corrige = $corrige[2]."/".$corrige[1]."/". $corrige[0]; return $corrige; } ?>A primeira função converte a data do formato brasileiro para o banco de dados. Existe uma função no PHP chamada EXPLODE que transforma uma STRING em uma MATRIZ através de uma STRING delimitadora. Eu usei como STRING delimitadora no primeiro SCRIPT o /, pois ele quebrou a STRING DD/MM/AAAA em três pedaços AA MM DDDD e depois reescrevi a data com a saída dos pedaços, sendo que como sabemos uma MATRIZ começa com o índice 0, então temos três pedaços a primeira STRING quebrada tem o índice 2, pois o ANO estava no final, a string MES será na posição 1 e a terceira STRING será na posição 0. Então reescrevo da maneira acima. E para fazer o INVERSO, criei uma outra função usando a STRING delimitadora o - que era repetido e reescrevi da mesma maneira. Abaixo segue uma série de script que criei usando a mesma lógica, usando PEDAÇOS de string para escrever DATA. <?php //extrai aaaa-mm-dd de aaaa-mm-dd H:M:S function get_data_datetime($data) { if ($data == "") return ""; $ano = explode(" ",$data); $corrige = $ano[0]; return $corrige; } //converte aaaa-mm-dd h:m:s para dd/mm/aaaa H:m:s function formata_data_br_time($data) { if ($data == "") return ""; $corrige = explode("-",$data); $ano = explode(" ",$corrige[2]); $corrige = $ano[0]."/".$corrige[1]."/". $corrige[0]." - ".$ano[1]; return $corrige; } //extrai h:m:s de aaaa-mm-dd h:m:s function get_hora_time($data) { if ($data == "") return ""; $corrige = explode("-",$data); $ano = explode(" ",$corrige[2]); $corrige = $ano[1]; return $corrige; } function get_data_br_time($data) { //converte aaaa-mm-dd para dd/mm/aaaa if ($data == "") return ""; $corrige = explode("-",$data); $ano = explode(" ",$corrige[2]); $corrige = $ano[0]."/".$corrige[1]."/". $corrige[0]; return $corrige; } ?>3) Converter para PortuguêsOutro grande problema que o PHP não traduz automática para o Português. Por isso você precisará do SCRIPT abaixo para tradução de Mês e Dia da Semana. Abaixo explico como escrevi esses SCRIPTS. <?php // converte o dia da semana conseguido pelo date("w") para texto em português. Vendo a tabelinha acima vemos que WEEKDAY function get_semana_pt($semana) { $semana = intval($semana);//CONVERTE PARA INTEIRO $arr = array('Domingo','Segunda-Feira','Terça-Feira','Quarta-Feira','Quinta-Feira','Sexta-Feira','Sábado'); return $arr[$semana]; } // Função para mês fiz diferente, porque, se fizesse o ARRAY igual fiz acima, começaria no INDICE 0 e daí teria que somar +1 para sair corretamente, então preferi escrever o script abaixo function get_mes_pt($m) { $m = intval($m);//CONVERTE PARA INTEIRO $or[1] = "Janeiro"; $or[2] = "Fevereiro"; $or[3] = "Março"; $or[4] = "Abril"; $or[5] = "Maio"; $or[6] = "Junho"; $or[7] = "Julho"; $or[8] = "Agosto"; $or[9] = "Setembro"; $or[10] = "Outubro"; $or[11] = "Novembro"; $or[12] = "Dezembro"; return $or[$m]; } ?>Agora olha que maneira interessante de escrever Sábado, 04 de fevereiro de 2017 em script, olha como seria! <?= get_semana_pt($semana).", ".date("d")." de ".get_mes_pt(date("m"))." de ".date("Y") ?>Veja como é bem simples. 4) Comparar datasOutra coisa que todo programador acha complicado é comparar uma data com a outra. Se eu fizer o script abaixo, ele não irá funcionar, pois estarei comparando STRINGS e não datas. <?php if(date("Y-m-d") == '2017-02-04'){Para fazer uma comparação correta irei codificar a data em STRTOTIME é uma função nativa do PHP que converte a data em timestamp em UNIX (número em segundos desde 01/01/1970 00:00:00). A saída serão números então consigo comparar. Veja um exemplos abaixo de como parar datas. <?php $dt1 = strtotime(date("Y-m-d")); $dt2 = strtotime('2017-02-04'); if($dt1 == $dt2){ echo "as datas são iguais"; }else{ echo "diferente"; } ?>Converti as datas em STRTOTIME que a saída serão números e consigo comparar se são iguais (==) ou (>) maior ou (<) menor. É possível trabalhar com comparações através de STRTOTIME, porém existe ALGO MUITO IMPORTANTE, as versões chamadas PHP6 = 5.4 e PHP7 = 5.6 Se eu não delimitar a TIMEZONE não funciona simplesmente. Então antes de fazer a comparação deverá se adicionar a linha abaixo, veja. <? date_default_timezone_set('America/Sao_Paulo'); ?>Essa linha irá apenas converter o formato de datas para America São Paulo, dizendo que estou no Brasil, no fuso horário de São Paulo. 5) Descobrir data futura ou passada com PHPEntão com STRTOTIME + DATE é possivel descobrir uma data futura ou passada com com as funções DATE e o STRTOTIME. Vamos então ver qual o código para descobrir AMANHÃ, ONTEM, a data de hoje daqui 1 mês, a data de hoje há um mês atrás, há um ano atrás e por aí vai. <?php echo strtotime("now")."<br />";echo strtotime("02 February 2017")."<br />";echo strtotime("+1 day")."<br />";echo strtotime("+1 week")."<br />";echo strtotime("+1 week 2 days 4 hours 2 seconds")."<br />";echo strtotime("next Thursday")."<br />";echo strtotime("last Monday")."<br />"; ?> A saída será: 1486315300 1486000800 1486401700 1486920100 1487107302 1486605600 1485741600 Mas como fazer isso sair no formato que eu quero, mesmo, por exemplo quero imprimir a data de amanhã como 05/02/2017. Segue abaixo a combinação de DATE + STRTOTIME. A) Acrescendo DIASÉ extremamente simples veja: echo date('Y-m-d', strtotime("now"))); echo date('Y-m-d', strtotime("yesterday"))); echo date('Y-m-d', strtotime("tomorrow"))); echo date('Y-m-d', strtotime("+1 days", strtotime('2017-02-04'))); echo date('Y-m-d', strtotime("-1 days", strtotime('2017-02-04'))).;A saída será a seguinte: 2017-02-04 2017-02-03 2017-02-05 2017-02-05 2017-02-03 Se eu quisesse que a saída saisse no formato BR, era muito simples a troca. echo date('d/m/Y', strtotime("+1 days", strtotime("now"))); echo date('d/m/Y', strtotime("+1 days", strtotime("yesterday")));04/02/2017 B) Acrescendo MESESecho date('Y-m-d', strtotime("+1 month", strtotime('2017-02-04')))."<br />"; echo date('Y-m-d', strtotime("-1 month", strtotime('2017-02-04')))."<br />";A saída será a seguinte: 2017-03-04 C) Acrescendo Anosecho date('Y-m-d', strtotime("+1 year", strtotime('2017-02-04')))."<br />"; echo date('Y-m-d', strtotime("-1 year", strtotime('2017-02-04')))."<br />";A saída será a seguinte: 2018-02-04 Espero que essas dicas tenham te ajudado. Até mais! Prof. Daniela Pires Programadora Web PHP / CSS3 / AJAX-QUERY / HTML5 / SEO Professora de Programação Web e Banco de Dados Pós Graduada em Consultoria em Tecnologia Web pela Impacta Autor(es): Daniela Pires (04/02/2017) |