Uma introdução à classe PHP DateInterval

A smiling man with a gesture of curiosity next to the text 'Programming languages for beginners' with handwritten questions 'Python?', 'Java?', 'C++?' floating around him, indicating a discussion about which programming language is suitable for beginners.

Compartilhe esta postagem

Índice do Conteúdo

Receba nosso boletim

Novos contatos

nossa newsletter

A manipulação de data e hora é uma parte inevitável da programação; inevitavelmente haverá uma parte de um projeto que requer uma data para ser modificada. Embora, superficialmente, repetir uma data no futuro traga um pouco de realização, ela pode ser rapidamente erradicada quando alguém recebe a tarefa de manipulando essa data. Sem estar ciente do arsenal de ferramentas que o PHP fornece em relação ao trabalho com datas, você pode acabar escrevendo erros que convertem strings em carimbos de data/hora 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 DateInterval objeto, é 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 seja ideal ao conversar com outra pessoa, 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 uma ISO para isso.

ISO 8601 é o padrão internacional que define como usar, armazenar e transferir informações de data, hora e duração. A string específica para definir durações é um padrão fácil de lembrar:

PYMDTHMS
  • P: período
  • E: anos
  • M: meses
  • D: dias
  • T: tempo
  • H: horas
  • M: minutos
  • S: segundos

Exceto por cada designador é opcional. Imediatamente antes de cada designador está a quantidade de tempo que você deseja armazenar. Abaixo está uma tabela mostrando exemplos de diferentes intervalos de data e hora:

CordaEquivalente a…
P1Y1 ano
P1M1 mês
P1D1 dia
P30D30 dias
PT1H1 hora
PT5M5 minutos
PT35S35 segundos
P1Y6M29DT4H34M23S1 ano, 6 meses, 29 dias, 4 horas, 34 minutos, 23 segundos

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 o PHP DateInterval aula.

Vamos definir uma duração previsível, criar um DateInterval objeto e envie o resultado para a tela. Começaremos com “1 ano, 2 meses, 3 dias, 4 horas, 5 minutos, 6 segundos”.

$Duration = new DateInterval( "P1Y2M3DT4H5M6S" ); print_r( $Duration ); 

Resultado:

DateInterval Object ( [y] => 1 [m] => 2 [d] => 3 [h] => 4 [i] => 5 [s] => 6 ... ) 

Você notará que o construtor do DateInterval class analisou sua duração e armazenou os valores individuais em suas próprias propriedades.

$Duration->y corresponde ao 1Y da string de duração que você passou. Vamos tentar outra duração mais prática: 1 mês. Você notará que qualquer duração indefinida será automaticamente padronizada como 0.

$Duration = new DateInterval( "P1M" ); print_r( $Duration ); 

Resultado:

DateInterval Object ( [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 bom e tangível nisso?

O verdadeiro benefício do que temos aqui é que o $Duration o próprio objeto representa uma duração de tempo. Não precisamos saber a data de origem ou destino; $Duration é simplesmente 1 mês. Observação: É importante observar que a criação de um DateInterval com 13 meses (P13M) não irá rolar e fornecer a você “1 ano 1 mês”. Isso faz sentido porque não temos uma data de origem ou destino.

Imagine o caso de 61 dias:

  • No dia 1º de outubro, é 2 meses
  • No dia 1º de dezembro, é apenas 1 mês e 30 dias
  • No dia 1º de fevereiro, é 2 meses e 2 dias (ou apenas 2 meses e 1 dia em anos bissextos)

Manipulando Datas com Durações

As durações controlam a manipulação de objetos PHP DateTime. O PHP DateTime classe tem três métodos que funcionam com um DateInterval objeto:

Ambos add e sub modificará um DateTime objeto por um DateIntervalenquanto diff vou comparar dois DateTime objetos e retornar um DateInterval.

$Now = new DateTime(); echo $Now->format('Y-m-d'); // 2014-06-12 $Duration = new DateInterval('P1M'); // 1 month $Now->add( $Duration ); echo $Now->format('Y-m-d'); // 2014-07-12 $Duration = new DateInterval('P2M'); // 2 months $Now->sub( $Duration ); echo $Now->format('Y-m-d'); // 2014-05-12

No exemplo acima você pode ver como a manipulação de datas se torna muito mais fácil e previsível usando DateInterval objetos para modificar DateTime objetos. O diff O método é igualmente fácil de usar, mas fornece uma informação extra: total de dias. Isto é importante porque ao usar o DateTime objeto para encontrar uma diferença, temos uma data de origem e de destino e, portanto, podemos reduzir as unidades de tempo em denominações maiores.

No entanto, ter o número total de dias entre eles é uma informação valiosa.

$Year = new DateInterval('P1Y'); echo $Year->days; // 0 $Date1 = new DateTime(); $Date2 = new DateTime(); $Date2->add( $Year ); $Difference = $Date1->diff( $Date2 ); echo $Difference->days; // 365

Durações de leitura e extração de intervalos

Inevitavelmente haverá momentos em que você desejará extrair partes do intervalo armazenado (da mesma forma que faria com uma data). O DateInterval classe tem um prático format método.

Os documentos PHP têm um tabela para o método de formato essa é uma referência útil. Você usa o format método como este:

$Duration = new DateInterval('P345D'); echo $Duration->format('I am %d days'); // I am 345 days

Observação: É importante notar que, para aqueles familiarizados com o strftime método, que os caracteres reconhecidos são completamente diferentes. Por exemplo, o DateInterval::format método interpreta %a como total de dias enquanto strftime interpreta-o como uma representação textual do dia (ou seja,

“Sol”). Curiosamente, DateInterval não tem nativamente uma maneira de extrair toda a especificação do intervalo sem os valores zero. Isso deixa você com duas opções:

  1. Extraia-o com 0 elementos, o que é perfeitamente aceitável
  2. Estenda o DateInterval aula

A segunda opção, a extensão do DateInterval classe, traz consigo dificuldades próprias que não abordaremos aqui hoje. Para extrair a especificação do intervalo com os elementos 0 intactos, você pode usar o mesmo método de formato assim:

$Duration = new DateInterval('P345D'); echo $Duration->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S

Se você quiser confirmar o acima, basta criar um novo DateInterval com o resultado do primeiro:

$interval_spec="P345D"; $Duration1 = new DateInterval( $interval_spec ); echo $Duration1->format('%d'); // 345 $interval_spec = $Duration1->format('P%yY%mM%dDT%hH%iM%sS'); // P0Y0M345DT0H0M0S $Duration2 = new DateInterval( $interval_spec ); echo $Duration2->format('%d'); // 345

Agora você deve ter uma noção do uso do PHP DateInterval classe e seus recursos. Esperamos que você seja capaz de aplicar esses projetos de aplicativos da web atuais e futuros.

Conteúdo relacionado

O que é um intervalo?

Simplificando, um intervalo é uma duração de tempo. É uma maneira de representar quantos anos, meses, dias, horas, minutos e segundos compõem um determinado período.

Como criar um objeto DateInterval em PHP?

Para criar um objeto DateInterval em PHP, você pode usar a seguinte sintaxe:

$Duration = new DateInterval( “P1Y2M3DT4H5M6S” );

Isso criará um objeto DateInterval que representa 1 ano, 2 meses, 3 dias, 4 horas, 5 minutos e 6 segundos.

Como manipular datas com durações em PHP?

Você pode manipular datas com durações em PHP usando os métodos add e sub da classe DateTime juntamente com um objeto DateInterval. Por exemplo:

$Now = new DateTime();
$Duration = new DateInterval(‘P1M’); // 1 month
$Now->add( $Duration );

Isso adicionará 1 mês à data atual.

Como ler e extrair intervalos em PHP?

Para ler e extrair intervalos em PHP, você pode usar o método format da classe DateInterval. Por exemplo:

$Duration = new DateInterval(‘P345D’);
echo $Duration->format(‘I am %d days’); // I am 345 days

Isso exibirá a mensagem “I am 345 days” com base no intervalo de 345 dias.

O que fazer se eu quiser extrair a especificação completa de um intervalo em PHP?

Se você quiser extrair a especificação completa de um intervalo em PHP, incluindo os elementos com valor zero, você pode usar o método format com a string de formatação apropriada. Por exemplo:

$Duration = new DateInterval(‘P345D’);
echo $Duration->format(‘P%yY%mMT%hH%iM%sS’); // P0Y0M345DT0H0M0S

Isso exibirá a especificação completa do intervalo, incluindo os elementos com valor zero.

Assine a nossa newsletter

Receba atualizações e aprenda com os melhores

explore mais conteúdo

aprenda mais com vídeos

você que impulsionar seu negócio?

entre em contato conosco e saiba como

contatos midiapro
small_c_popup.png

Saiba como ajudamos mais de 100 das principais marcas a obter sucesso

Vamos bater um papo sem compromisso!