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:
Corda | Equivalente a… |
---|---|
P1Y | 1 ano |
P1M | 1 mês |
P1D | 1 dia |
P30D | 30 dias |
PT1H | 1 hora |
PT5M | 5 minutos |
PT35S | 35 segundos |
P1Y6M29DT4H34M23S | 1 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 DateInterval
enquanto 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:
- Extraia-o com 0 elementos, o que é perfeitamente aceitável
- 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.