A Classe DateTime - Trabalhando com Datas e Times com Orientação a Objetos

Neste tutorial, vamos aprender como trabalhar com datas e tempo através da programação orientada a objetos em PHP.

Estudar pela apostila de PHP

Criando objetos da classe DateTime

A classe DataTime provém uma série de métodos, atributos e possibilidades que nos permitem trabalhar de maneira muito mais fácil com datas e tempo, usando orientação a objetos.

Vamos criar um objeto desta classe:
$date = new DateTime();

Se dermos um print_c($date);, veremos que no resultado é o atual, do momento da criação do objeto:
DateTime Object (
[date] => 2019-02-28 11:06:53.684238
[timezone_type] => 3
[timezone] => America/Sao_Paulo )

É um objeto do momento atual, no momento que estou programando este tutorial.

Construtor da classe DateTime

Podemos, porém, já inicializar com uma data, no formato: ano-mes-dia, para criar um objeto com uma data específica.

Vamos escolher uma data aleatória:
$date = new DateTime("2020-02-28");

O resultado da print_r($date); é:
DateTime Object (
[date] => 2019-02-28 00:00:00.000000
[timezone_type] => 3
[timezone] => America/Sao_Paulo )

Formatando datas e horas: Método format()

A classe DateTime possui o método format() que usa os mesmos parâmetros da função date(), assim podemo exibir o formato de data e hora do jeito que quisermos.

Por exemplo, para exibirmos no formato brasileiro de: dd/mm/YYYY Hora:minuto:segundo, basta fazer:
$date = new DateTime();
echo $date->format( "d/m/Y H:i:s" );

Somando e Subtraindo datas

Que tal saber qual foi a data de 35 dias atrás?
Basta fazer:

$date = new DateTime('-35 days');
echo $date->format( "d/m/Y H:i:s" );

E qual data vai ser daqui 2 semanas e 10 dias?
$date = new DateTime('+2 weeks 10 days');
echo $date->format( "d/m/Y H:i:s" );

Diferença entre datas: Método diff()

Imagina calcular, de maneira instantânea a diferença de anos, meses, dias, horas, minutos e até segundos daqui até uma outra data?

Vamos pegar a data atual:
$hoje = new DateTime();

Agora uma futura qualquer:
$futuro = new DateTime('2020-02-27');

O array $diff vai armazenar a diferença entre $futuro e $hoje, assim:
$diff = $hoje->diff($futuro);

Para exibir o resultado, faça:
 <?php
  $hoje = new DateTime();
  $futuro = new DateTime('2020-02-27');
  
  $diff = $hoje->diff($futuro);
  
  echo "Diferença de: <br/>"
    .$diff->days . " dias <br/>"
    .$diff->m . " meses <br/>"
    .$diff->y . " anos <br/>"
    .$diff->h . " horas <br/>"
    .$diff->i . " minutos <br/>"
    .$diff->s . " segundos<br/>";
 ?>
O resultado aqui foi:
Diferença de:
363 dias
11 meses
0 anos
12 horas
28 minutos
28 segundos

Bem preciso esse PHP, não ?

Modificando Data e Hora: setDate() e setTime()

Após criar e definir seu objeto do tipo DateTime, é totalmente possível mudar seus atributos, como ano, dia, hora ou o que for, através dos setters.

Vamos definir a data atual e exibir ela:
$data = new DateTime();
echo $data->format( "d/m/Y H:i" )."<br />";

O resultado é: 28/02/2019 11:37 (sim, tá quase na hora do almoço)

Agora vamos mudar a data pra 01/03/2019, amanhã e o horário para 12:00.
Nosso código fica assim:
$data->setDate(2019,03,01);
$data->setTime(12,0,0);
echo $data->format( "d/m/Y H:i" )."<br />";

E o resultado assim: 01/03/2019 12:00

Bonitinho, não?

Comparando Datas: var_dump

Muitas vezes é preciso saber se uma data é igual a outra, se é anterior, posterior...
Vamos criar uma variável que representa hoje e outra amanhã:
  $hoje = new DateTime();
  $amanha = new DateTime('2019-03-01');

Vamos comparar se elas são iguais:
  var_dump($hoje == $amanha);

O resultado vai ser: bool(false)

Agora vamos comparar se amanhã é maior que hoje:
  var_dump($amanha > $hoje);

O resultado vai ser: bool(true)

Que bom que deu verdade, né?


É possível ainda trabalhar com fuso-horário, somar intervalos de tempo, subtrair, definir língua e local que vai usar e uma porção de outros métodos para você usar, para aprender mais, acesse a documentação oficial do PHP:

http://php.net/manual/pt_BR/class.datetime.php