A manipulação de data e hora é uma parte inevitável da programação de seu site; inevitavelmente haverá uma parte de um projeto que requer uma data para ser modificada. Embora, na superfície, ecoar uma data no futuro traga um pouco de realização, ela pode ser rapidamente erradicada quando alguém é encarregado de manipular essa data. Sem estar ciente do arsenal de ferramentas que o PHP oferece no que diz respeito ao trabalho com datas, você pode se encontrar escrevendo kludges que convertem strings em timestamps para várias comparações.
Hoje vamos dissecar a classe PHP DateInterval, uma ferramenta poderosa para lidar com datas em um aplicativo web. Mas antes de aprender sobre o DateIntervalobjeto, é preciso primeiro entender o que é um intervalo .
O que é um intervalo?
Simplificando, um intervalo é uma duração de tempo.
Quando conversamos sobre o tema da duração, não diríamos: “Querida, estarei em casa no dia 3 de dezembro de 2015 às 15h19”. Em vez disso, simplificaríamos e diríamos “Estarei em casa em 5 minutos”. Embora isso seja ideal ao conversar com outra pessoa, isso não é tão bom quanto uma construção de dados. Então, como definimos “em 5 minutos” para um aplicativo da web? Felizmente, existe um ISO para isso.
A ISO 8601 é o padrão internacional que define como usar, armazenar e transferir informações de data, hora e duração.
Criando um objeto DateInterval
Agora que entendemos o que é um intervalo, é simplesmente uma duração de tempo, e que a ISO 8601 define o formato da nossa duração, podemos começar a brincar com a DateIntervalclasse PHP. Vamos definir uma duração previsível, criar um DateIntervalobjeto e exibir o resultado na tela. Começaremos com “1 ano, 2 meses, 3 dias, 4 horas, 5 minutos, 6 segundos”.
$Duração = new DateInterval(“P1Y2M3DT4H5M6S”); print_r( $Duração);
Resultado:
Objeto DateInterval ( [y] => 1 [m] => 2 [d] => 3 [h] => 4 [i] => 5 [s] => 6 …
)
Você notará que o construtor da DateIntervalclasse analisou sua duração e armazenou os valores individuais em suas próprias propriedades. $Duration->ycorresponde à 1Ystring de duração que você passou. Vamos tentar outra duração mais prática: 1 mês. Você notará que quaisquer durações indefinidas são automaticamente padronizadas para 0.
$Duração = new DateInterval(“P1M”); print_r( $Duração);
Resultado:
Objeto DateInterval ( [y] => 0 [m] => 1 [d] => 0 [h] => 0 [i] => 0 [s] => 0 … )
Então agora sabemos o que está acontecendo, mas o que realmente temos? O que há de tão grande e tangível nisso?
O benefício real do que temos aqui é que o $Durationpróprio objeto representa uma duração de tempo. Não precisamos saber uma data de origem ou destino; $Durationé simplesmente 1 mês. Observação: é importante observar que criar um DateIntervalcom 13 meses ( P13M) não acumulará e fornecerá “1 ano 1 mês”. Isso faz sentido porque não temos uma data de origem ou destino.
Imagine o caso de 61 dias:
- Em 1º de outubro, são 2 meses
- Em 1º de dezembro, é apenas 1 mês e 30 dias
- Em 1º de fevereiro, são 2 meses e 2 dias (ou apenas 2 meses e 1 dia em anos bissextos)