Meus Textos

Blog

Blog

Trabalhando com datas em PHP, comparar, saber data futura passada

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 BR

Se 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:
date("d/m/Y") saída 04/02/2017
d = dia de 01 a 31
m = mês de 01 a 12
Y = em 4 dígitos

Abaixo todos parâmetros de data que existem, essa informação foi retirada do site PHP.NET.

Day/Dia
d Dia do mês, 2 dígitos com zero à esquerda 01 até 31
j Dia do mês sem zero à esquerda 1 até 31
S Sufixo ordinal inglês para o dia do mês, 2 caracteres stndrd ou th. Funciona bem com j
l ('L' minúsculo) A representação textual completa do dia da semana Sunday até Saturday
z O dia do ano (iniciando em 0) 0 até 365
WeekDay/Dia da Semana
w Representação numérica do dia da semana 0 (para domingo) até 6(para sábado)
D Uma representação textual de um dia, três letras Mon até Sun
N Representação numérica ISO-8601 do dia da semana (adicionado no PHP 5.1.0) 1 (para Segunda) até 7 (para Domingo)
W Número do ano da semana ISO-8601, começa na Segunda (adicionado no PHP 4.1.0) Exemplo: 42 (a 42ª semana do ano)
Mês
m Representação numérica de um mês, com zero à esquerda 01 a 12
F Um representação completa de um mês, como January ou March January até December
M Uma representação textual curta de um mês, três letras Jan a Dec
n Representação numérica de um mês, sem zero à esquerda 1 a 12
t Número de dias de um dado mês 28 até 31
Year/Ano
Y Uma representação de ano completa, 4 dígitos Exemplos: 1999ou 2003
L Se está em um ano bissexto 1 se está em ano bissexto, 0, caso contrário.
o Número do ano ISO-8601. Este tem o mesmo valor como Y, exceto que se o número da semana ISO (W) pertence ao anterior ou próximo ano, o ano é usado ao invés. (adicionado no PHP 5.1.0) Exemplos: 1999ou 2003
y Uma representação do ano com dois dígitos Exemplos: 99 ou 03
Time/Tempo
H Formato 24-horas de uma hora com zero à esquerda 00 até 23
i Minutos com zero à esquerda 00 até 59
s Segundos, com zero à esquerda 00 até 59
a Antes/Depois de meio-dia em minúsculo am or pm
A Antes/Depois de meio-dia em maiúsculo AM or PM
B Swatch Internet time 000 até 999
g Formato 12-horas de uma hora sem zero à esquerda 1 até 12
G Formato 24-horas de uma hora sem zero à esquerda 0 até 23
h Formato 12-horas de uma hora com zero à esquerda 01 até 12
u Microssegundos (adicionado no PHP 5.2.2). Note que a função date()sempre gerará 000000, já que aceita um parâmetro integer, enquanto que DateTime::format() possui suporte a microssegundos se DateTimefoi criado com microssegundos. Example: 654321
Fuso horário
e Identificador do fuso horário (adicionado no PHP 5.1.0) Exemplos: UTCGMTAtlantic/Azores
I (i maiúsculo) Se a data está ou não no horário de verão 1 se horário de verão, 0, caso contrário.
O Deslocamento ao Horário de Greenwish (GMT) em horas Exemplo: +0200
P Deslocamento ao Horário de Greenwish (GMT) com dois pontos entre horas e minutos (adicionado no PHP 5.1.3) Exemplo: +02:00
T Abreviação do fuso horário Exemplos: ESTMDT ...
Z Deslocamento, em segundos, do fuso horário. O deslocamento para fusos horários a oeste de UTC sempre será negativa, e para aqueles à leste de UTC sempre será positiva. -43200 até 50400
Data/Hora completa
c Data ISO 8601 (adicionado no PHP 5) 2004-02-12T15:19:21+00:00
r » RFC 2822 formatted date Exemplo: Thu, 21 Dec 2000 16:01:07 +0200
U Segundos desde Unix Epoch (January 1 1970 00:00:00 GMT) Veja também time()

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ês

Outro 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 datas

Outra 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 PHP

Entã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
03/02/2017

B) Acrescendo MESES

echo 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
2017-01-04

C) Acrescendo Anos

echo 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
2016-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)