Manipulando datas com PHP

Veja nesse artigo como manipular e trabalhar com datas no PHP (Date PHP).

A manipulação de datas pelos programas é um dos grandes assuntos para o desenvolvimento, pois a maioria dos sistemas utilizam datas para controlar seu funcionamento e nada melhor que utilizar o Date PHP, que possui um vasto suporte a manipulação de datas. Ao longo deste artigo iremos ver as funções referente a manipulação de datas e também o objeto DateTime.

Função Date PHP

A função date() do PHP recebe apenas um parâmetro: o formato de data. Por padrão, sempre será mostrada a data do momento atual da execução, como mostra o código a seguir:


      <?php
        echo date("d/m/Y");
        // 20/06/2015

Função time

A função time() do PHP retorna qualquer número de segundos desde a era UNIX, que é de 1º de Janeiro de 1970 00:00:00 até a hora atual de execução. Este número também é chamado de timestamp UNIX. Para utilizar a função basta declara-la conforme a Listagem 1.

Listagem 1. Função time.


      <?php
        $nextWeek = time() + (7 * 24 * 60 * 60);
        echo 'Now:       '. date('d-m-Y') ."<br>";
        echo 'Next Week: '. date('d-m-Y', $nextWeek) ."<br>";
        echo 'Next Week: '. date('d-m-Y', strtotime('+1 week')) ."<br>";
      // Now: 04-07-2015 à Data atual 
      // Next Week: 11-07-2015 à Uma semana após a data atual
      // Next Week: 11-07-2015 à Uma semana após a data atual utilizando strtotime

Utilizando time() podemos, por exemplo, apresentar em nosso sistema a data atual para o usuário, além da data da próxima semana a data de execução do exemplo apresentado.

Função strtotime

A função strtotime() recebe como parâmetro uma string de formato de data em inglês e tenta analisar esse formato. É como tentar transformar uma frase que possui possíveis informações de data em uma data real, como mostra o código a seguir:


      <?php
        echo 'Next Month: '. date('d-m-Y', strtotime('+1 month')) ."<br>";
        // Next Month: 04-08-2015

A função date() traz a data atual da execução. Usando a função strtotime() e acrescentando +1 month, a mesma interpretará que a função deve retornar a data de execução mais um mês.

Função mktime

A função mktime() recebe como parâmetro hora, minuto, segundo, mês, dia e ano, como mostra a Listagem 3.

Listagem 3. Função mktime.


      <?php
        $data = mktime(02,30,00,04,30,1995);
         // Mostra 30-04-1995
         echo date("d-m-Y", $data)."<br>";
        
        // Mostra 30-04-1995 02:30
        echo date("d-m-Y H:i", $data)."<br>";
        
        // Mostra 1995 
        echo date("Y", $data)."<br>";

Função DateTime

A função DateTime no PHP permite trabalhar com data e hora como se fossem objetos que podem ser facilmente manipulados através de diversos métodos, facilitando a criação de regras de negócio com base em datas, além da conversão e a manipulação de diferentes formatos. A criação de um objeto da classe DateTime é a maneira mais fácil de manipular datas na sua aplicação. Veja na Listagem 4.

Listagem 4. Função DateTime.


      <?php
                  $atual = new DateTime();
                  $especifica = new DateTime(' 1990-01-22');
                  $texto = new DateTime(' +1 month');
       
                  print_r($atual);
                  print_r($especifica);
                  print_r($texto);
                              
      /* DateTime Object ( [date] => 2015-06-20 19:03:45 [timezone_type] => 3 [timezone] => UTC ) DateTime Object ( [date] => 1990-01-22 00:00:00 [timezone_type] => 3 [timezone] => UTC ) DateTime Object ( [date] => 2015-07-20 19:03:45 [timezone_type] => 3 [timezone] => UTC )
      */

Veja que $atual é um novo objeto da classe DateTime e, como não é especificado nenhum parâmetro, então recebe a data e hora atual da execução. Já $especifica recebe o objeto também só que é especificado a data que será mostrada, enquanto que $texto recebe o mesmo objeto, só que um mês a frente da data atual da execução.

A partir do momento que o objeto da classe DateTime é instanciado podemos transformá-lo em uma string utilizando o método format(). Este método permite que se especifique um padrão, como mostra a Listagem 5.

Listagem 5. Uso do método format()


      <?php
                  $data = new DateTime();
                  echo $data->format('d-m-Y H:i:s'); 
                  $data = new DateTime('+1 month');
                  echo $data->format('d-m-Y H:i:s'); 
       
      // 20-06-2015 19:47:27
     // 20-07-2015 19:47:27

Fizemos a mesma coisa que na Listagem 4, só que agora com o “->” acessamos o método format e definimos que o formato de nossa data e hora será Dia, mês, ano, Hora, Min e seg.

Podemos também alterar a data do objeto criado através da classe DataTime utilizando o método modify(), como mostra a Listagem 6.

Listagem 6. Método modify.


      <?php
        $data = new DateTime('22-01-1990');
        $data->modify('+1 month');
        echo $data->format('d-m-Y H:i:s');
                  
      // 22-02-1990 00:00:00

Criamos na $data um objeto da classe DateTime e passamos uma data. Com o “->” dizemos para o método modify acrescentar um mês e quando demos echo é apresentado a data com um mês acrescido a data que já tínhamos definido.

Ajustando a data

Com o objeto da classe DateTime criado podemos alterar apenas a data do objeto, utilizando para isso o método setDate(), que recebe três parâmetros: o ano, o mês e o dia para qual desejamos ajustar, como mostra a Listagem 7.

Listagem 7. Método setDate.


  <?php
    $data = new DateTime('22-01-1990');
    $data->setDate(1995, 3, 9);
    echo $data->format('d-m-Y H:i:s');
                          
  // 09-03-1995 00:00:00

A $data tem um objeto da classe DateTime recebendo uma data. Através do -> acessamos o método setDate() e alteramos a data para 1995, 3, 9.

Caso tenha uma data vinda de um formulário no formato DD/MM/YYYY, não é necessário converter o formato da mesma para trabalhar com ela. Basta, através do método createFromFormat, especificar o formato que esteja trabalhando. Observe o exemplo a seguir:

 
    <?php
      $data = '09-03-1995';
      $data1 = DateTime::createFromFormat("d-m-Y", $data);
      echo $data1->format("d-m-Y");
    // 09-03-1995
    ?>

Note que o resultado retornado foi no formato d-m-Y.

Ajustando o horário

Também podemos alterar apenas o horário do nosso objeto da classe DateTime utilizando o método setTime(). O mesmo recebe três parâmetros: a hora, os minutos e os segundos, sendo que os segundos é um parâmetro opcional, como mostra a Listagem 8.

Listagem 8. Método setTime.

  <?php
        $data = new DateTime('22-01-1990');
        $data->setTime(9, 15, 44);                  
        echo $data->format('d-m-Y H:i:s');
      // 22-01-1990 09:15:44   

Através do método setTime() definimos o horário e com o método format() definimos o formato de nossa data e hora.

Ajustando o fuso

Para ajustarmos o fuso horário de um objeto data precisamos criar um novo objeto da classe DateTimeZone. Um objeto desta classe representa um fuso horário válido e pode ser utilizado junto ao método da classe DateTime, como mostra a Listagem 9.

Listagem 9. Classe DateTimeZone.


      <?php
        $fuso = new DateTimeZone('America/New_York');
        $data = new DateTime('22-01-1990');
        $data->setTimezone($fuso);
        echo $data->format('d-m-Y H:i:s');
      // 21-01-1990 19:00:00

$fuso é um objeto da classe DateTimeZone e recebe como parâmetro o fuso horário. $data é um objeto da classe DateTime e nele definimos uma data que, através do método setTimezone executamos o $fuso e com o método format() definimos um padrão de formato para nossa data e hora.

Intervalos

Em alguns momentos será necessária a criação e análise de intervalos entre datas. Objetos da classe DateInterval representam um intervalo entre datas que pode armazenar um tempo (em anos, meses, dias ou horas) ou uma string relativa ao tempo que pode ser interpretada pelo construtor da classe DateTime.

Podemos criar intervalos utilizando um padrão que será passado ao método construtor da classe DateInterval. O padrão começa com a letra P, de período. A duração de cada período é representada por um número inteiro, seguido de um outro identificador de período. Se a duração do período contém horas, usamos o identificador T. Veja a seguir alguns identificadores existentes no PHP:

Alguns exemplos para entenderem melhor:

Veja a criação do objeto de intervalo em ação na Listagem 10.

Listagem 10. Classe DateInterval.


  <?php
    $intervalo = new DateInterval('P3YT8M');
    print_r($intervalo);
   
    /*
     DateInterval Object 
      ( 
        [y] => 3 
        [m] => 0 
        [d] => 0 
        [h] => 0 
        [i] => 8 
        [s] => 0 
        [invert] => 0 
        [days] => 
      )
  */

No exemplo criamos um novo objeto da classe DateInterval e passamos como parâmetro um período de três anos e oito minutos. Utilizando o print_r podemos ver perfeitamente o retorno, onde [y] =>3 representa os três anos e [i] =>8 representa os oito minutos.

Além de montar um intervalo, podemos formatá-lo utilizando outro padrão, como o a seguir:

Através do método format() aplicamos o padrão apresentado anteriormente em nosso objeto:


      <?php
        $intervalo = new DateInterval('P2Y4D');
        echo $intervalo->format('%y anos e %d dias');
      // 2 anos e 4 dias

O objeto $intervalo é criado da classe DateInterval e passamos como parâmetro um período de dois anos, que é representado por 2Y, e quatro dias, que é representado por 4D.

Diferença entre datas

Quando temos dois objetos da classe DateTime podemos compará-los com o método diff(), que retorna um objeto da classe DateInterval que também pode ser formato para mostrar na tela, como mostra o exemplo da Listagem 11.

Listagem 11. Método diff().


  <?php
    $data1 = new DateTime('2011-09-11');
    $data2 = new DateTime('2011-10-13');
    $intervalo = $data1->diff($data2);
    echo $intervalo->format('%R%a dias');
  // +32 dias

Criamos $data1 e $data2, da classe DateTime, e passamos uma data. Nosso $intervalo utilizando o método diff() faz a diferença de datas entre as variáveis data1 e data2. Utilizando o método format é retornado para nós a diferença de datas entre nossas variáveis.

Comparando datas

Uma das grandes vantagens de se trabalhar com objetos da classe DateTime é que podemos compará-los utilizando operadores comuns, como podemos ver nos exemplos da Listagem 12.

Listagem 12. Utilizando operadores simples para comparação de datas.


  <?php
    $data1 = new DateTime('2011-09-11');
    $data2 = new DateTime('2011-10-13');
    var_dump($data1 == $data2); 
    var_dump($data1 > $data2);
    var_dump($data1 < $data2);
  // boolean false
  // boolean false
  // boolean true

Foram criados objetos da classe DateTime e passado a eles datas. Com o var_dump fazemos comparações, por exemplo, em var_dump($data 1 > $data2) perguntamos se $data1 é maior que $data2 e como não é, então foi retornado um boolean false.

Somando intervalo a data e horário

A classe DateTime nós traz um método chamado add(), que nos permite acrescentar um período de tempo ao objeto DateTime criado, como vemos na Listagem 13.

Listagem 13. Método add().


  <?php
    $data = new DateTime('2011-09-11');
    print_r($data);
   
    $data->add(new DateInterval('P2M5D'));
    print_r($data);
              
    /*
     DateTime Object 
     (
       [date] => 2011-09-11 00:00:00 
       [timezone_type] => 3 
       [timezone] => UTC 
     ) 
     DateTime Object 
     ( 
      [date] => 2011-11-16 00:00:00 
       timezone_type] => 3 
      [timezone] => UTC 
     )
   */

Em $data criamos um novo objeto da classe DateTime e passamos uma data. Através do print_r apresentamos o resultado e depois com o método add() adicionamos a nossa a data um período de dois meses e cinco dias. Note que o primeiro resultado é a nossa data que definimos e no outro resultado já vem acrescido os meses e os dias que pedimos.

Subtraindo intervalo a data e horário

Da mesma forma que conseguimos adicionar hora, também podemos subtrair um determinado período sobre um objeto da classe DateTime, como vemos na Listagem 14.

Listagem 14. Método sub().


  $data = new DateTime('2011-12-31');
  print_r($data);
   
  $data->sub(new DateInterval('P7D'));
  print_r($data); 
  /*
  DateTime Object
    (
      [date] => 2011-12-31 00:00:00 
      [timezone_type] => 3 
      [timezone] => UTC
    ) 
  DateTime Object
    ( 
      [date] => 2011-12-24 00:00:00 
      [timezone_type] => 3 
      [timezone] => UTC 
    )
  */

Note que agora utilizando o método sub(), o que antes era o dia de nossa data (31) agora passou para 24, ou seja, diminuímos dias que é o que queríamos que ocorresse.

Configuração do Fuso Horário no PHP

Por padrão, o PHP utiliza sempre como fuso horário o valor já configurado na máquina onde ele está instalado. Isso pode ser um problema quando você tem várias aplicações rodando em um mesmo servidor que podem possuir um fuso horário diferente. Um exemplo disso é quando queremos atingir um público estrangeiro e outro brasileiro. Para especificar a timezone para cada aplicação utilizamos a função date_default_timezone_set(). Esta recebe apenas um parâmetro, que é o identificador de fuso-horário. Veja a seguir um exemplo.


      <?php
        date_default_timezone_set('America/Sao_Paulo');

Veja que setamos o fuso horário da máquina como sendo de São Paulo.

Os identificadores disponíveis mais comuns são:

Datas em outras línguas

Haverá momentos em que nós vamos precisar utilizar as funções de data em nossa aplicação e receber os nomes de meses e dias em português ou em outra língua. Nessa situação não podemos utilizar a função date() e sim a função strftime(), que permite a criação de strings a partir de uma timezone com outras línguas.

O comportamento da strftime() é muito similar à date, tendo apenas um padrão diferente, como vemos a seguir:

Veja um exemplo simples do comportamento da strftime():


      <?php
        echo strftime("%A");
        // Wednesday

Veja que mostramos o dia atual, que no caso é Wednesday. Os resultados obtidos vêm de acordo com a data atual de seu computador.

Uma ótima função para se trabalhar com date() é a getlastmod(), pois essa função apresenta para o tempo da última modificação na página, como mostra a Listagem 15.

Listagem 15. Função getlastmod().


      <?php
         header('Content-type: text/html; charset=UTF-8');                   
         echo "Última Modificação: " .date("F d Y H:i:s", getlastmod());
         // Última Modificação: June 24 2015 22:41:53              

Utilizamos a função date juntamente com getlastmod para mostrar na página a última modificação que ela teve.

Veremos na Listagem 16 uma função que checa se a data está correta. Por exemplo, sabemos que o mês de fevereiro é, quase sempre, de 28 dias, então, caso o usuário passe um valor que não esteja de acordo com o mês, está função barra tal ação.

Listagem 16. Função checkdate.


      <?php
        var_dump(checkdate(12, 31, 2000));
         var_dump(checkdate(2, 29, 2001));
                              
      // boolean true
      // boolean false

Nosso exemplo está no formato (Mês, dia e ano). A função checkdate retorna um boolean false ou true. Em nosso primeiro var_dump é passado uma data correta, então foi retornado um boolean true. Já no segundo var_dump ocorre o erro, pois foi passado como dia 29 para o mês de fevereiro, como no ano de 2000 fevereiro teve apenas 28 dias, sendo assim, foi retornado um boolean false.

Na Listagem 17 teremos a função getdate, que retorna para um array com dados. Por exemplo, qual dia do ano estamos, hora, minuto, e por ai vai.

Listagem 17. Função getdate.


      <?php
      $today = getdate();
      print_r($today);
                              
      /*
        Array 
      ( 
      [seconds] => 42 
      [minutes] => 18 
      [hours] => 1 
      [mday] => 25 
      [wday] => 4 
      [mon] => 6 
      [year] => 2015 
      [yday] => 175 
      [weekday] => Thursday 
      [month] => June 
      [0] => 1435195122
       )
      */

Veja que foi retornado um array com os dados atuais da data do computador em que foi executado o programa. Além das informações básicas, temos o [yday], que é 175, exatamente em qual dia dos 365 dias de 2015 que estamos.

Por último temos a função explode(), que pode ser usada quando queremos dividir uma data. Veja na Listagem 18.

Listagem 18. Função explode().


      <?php
      $data = date("d/m/Y");
       
      $data = explode("/", $data);
        
      list($dia, $mes, $ano) = $data;
        
      $data = "$ano/$mes/$dia";
       echo $data;
      

Criamos $data que guarda a data atual no formato (Dia, Mês, Ano) e ao utilizar a função explode, separamos os dados. Depois criamos $dia, $mes, $ano que é armazenado em $data. Com os dados guardados apenas passamos as variáveis de acordo com o formato que queremos, que é YYYY/MM/DD.

Função idate

A função idate, em conjunto com a strtotime, recebe como parâmetro uma string de data em inglês e é interpretada pelo PHP. Veja na Listagem 19 como funciona.

Listagem 19. Utilizando idate().


  <?php
  $timestamp = strtotime('9st March 1995');
  echo idate('m', $timestamp);
  // 3
      

Criamos $timestamp que recebe a função strtotime com as palavras em inglês. Utilizando a função idate() passamos o termo m, que significa que queremos que o PHP interprete o mês (march) e devolva para nós em número.

Espero que tenham gostado e até a próxima!

Artigos relacionados