PHP, Manipulando Datas (+Horas)

8 11 2007

Resolvi me adiantar e escrever um pouco sobre a manipulação de datas e tempo (hora) no php, coisas do cotidiano de um desenvolvedor.

1 – Data e Hora Atual

Pelo básico temos date(“d/m/Y”) resultando em ex: 01/01/2007, sendo d,m,Y representando dia, mês e ano na tabela de caracteres do parâmetro de formatação da função date.

d, exibe o dia sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
m, exibe o mês sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
Y, exibe o ano por extenso, 4 digitos, ex: 2007, utilizando y minúsculo teremos resultado 07

    Na mesma lógica temos date(“h:i:s”) exibindo a hora atual do sistema, resulando em ex: 01:01:50, temos então ,h,i,s representando hora, minutos e segundos respectivamente, tendo:

    h, exibe o hora sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
    i, exibe os minutos sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01
    s, exibe os segundos sendo exibidos 2 digitos, ex: ao invés de 1 é exibido 01

      É possível brincar de infinitas formas com o posicionamento dos parâmetros e situações que a data será exibida, ex: date(“d/m/Y h:i:s”) que irá exibir data e hora no formato convencional ou date(“Y-m-d h:i:s”) que retorna o padrão do MySQLcampo DateTime.

      2 – Dia da Semana (Extenso) a partir da Data

      Costumo utilizar a seguinte função (retornar dia da semana por extenso):

      /*
      Função que retorna o dia da semana
      Formato da data deverá ser Y-m-d
      */
      function Semana($data) {
      $rs = strftime('%w',strtotime($data));
      switch($rs) {
      case "0": $s = "Domingo"; break;
      case "1": $s = "Segunda-feira"; break;
      case "2": $s = "Terça-feira"; break;
      case "3": $s = "Quarta-feira"; break;
      case "4": $s = "Quinta-feira"; break;
      case "5": $s = "Sexta-feira"; break;
      case "6": $s = "Sábado"; break;
      }
      return $s;
      }

      Função muito simples que usa os recursos do strtotime (string to time) e do strftime (string format time), para usar basta passar a data pro formato que eu utilizei ou adaptar a função para fazé-lo automaticamente, não fiz isso pois utilizo funções de conversão, mostradas mais abaixo, mais ai vai o exemplo:

      echo Semana(2007-11-08); // Retorna Quinta-Feira

      3 – Formata data, para MySQL (Date) e Formulários

      Aqui serão exibidas duas funções, uma que converte a data no formato DateTime do MySQL para nosso padrão 01/01/2007 e outra que passa o padrão DateTime do MySQL para nosso padrão convencional.

      3.1 – Formato Date do MySQL para Padrão Convencional

      /*
      Função que converte Y-m-d para d/m/Y
      Utilizado para manipular datas no formato Date do MySQL
      exibindo no formato convencional.
      */
      function dtPadrao($data) {
      $data = trim($data);
      if (strlen($data) < 10)
      {
      $rs = "";
      }
      else
      {
      $arr_data = explode(" ",$data);
      $data_db = $arr_data[0];
      $arr_data = explode("-",$data_db);
      $data_form = $arr_data[2]."/".$arr_data[1]."/".$arr_data[0];
      $rs = $data_form;
      }
      return $rs;
      }

      Usando:

      echo dtPadrao("2007-11-08"); // Retornará 08/11/2007

      3.2 – Padrão Convencional para formato Date do MySQL

      /*
      Função que converte d/m/Y para Y-m-d
      Utilizado para inserir datas do tipo converncional em
      campos tipo Date do MySQL
      */
      function dtBanco($data) {
      $data = trim($data);
      if (strlen($data) != 10)
      {
      $rs = "";
      }
      else
      {
      $arr_data = explode("/",$data);
      $data_banco = $arr_data[2]."-".$arr_data[1]."-".$arr_data[0];
      $rs = $data_banco;
      }
      return $rs;
      }

      Usando:

      echo dtBanco("08/11/2007"); // Resultará 2007-11-08

      Espero ter ajudado, pois explicar linha a linha dessas funções é pedir demais.

      4 – Operações Básicas com Datas (Somar e Subtrair Dias)

      Existe N formas de se fazer isso, com N formas de desenvolver uma função para isso, então o que eu vou passar é a que eu justamente uso no meu dia a dia.

      4.1 – Operações em cima da Data Atual

      echo strftime("%d/%m/%Y", strtotime("+1 days")); // Hoje mais 1 dia

      echo strftime("%d/%m/%Y", strtotime("-2 days")); // Hoje menos 2 dias

      echo strftime("%d/%m/%Y %H:%M:%S", strtotime("+1 month 1 days 1 hours 1 minutes"));

      // Hoje + 1 mes, 1 dia, 1 hora e 1 minuto.

      Simples.

      4.2 – Operações em cima de qualquer Data.

      Para somar dias a uma data temos (no exemplo foi passado +1 dia):

      /*
      Função para somar datas em dias
      Data no formato Y-m-d
      */
      function dtSomar($data,$dias) {
      $data = str_replace("-","",$data);
      $ano = substr ( $data, 0, 4 );
      $mes = substr ( $data, 4, 2 );
      $dia = substr ( $data, 6, 2 );
      $novaData = mktime ( 0, 0, 0, $mes, $dia + $dias, $ano );
      return strftime("%Y-%m-%d", $novaData);
      }

      Usando (formato da data será Y-m-d):

      echo dtSomar("2007-01-10",1); // Resultará 2007-01-11

      Para subtrair dias a uma data temos (no exemplo foi passado -1 dia):

      /*
      Função para subtrair datas em dias
      Data no formato Y-m-d
      */
      function dtSubtrair($data,$dias) {
      $data = str_replace("-","",$data);
      $ano = substr ( $data, 0, 4 );
      $mes = substr ( $data, 4, 2 );
      $dia = substr ( $data, 6, 2 );
      $novaData = mktime ( 0, 0, 0, $mes, $dia - $dias, $ano );
      return strftime("%Y-%m-%d", $novaData);
      }

      Usando (formato da data será Y-m-d):

      echo dtSubtrair("2007-01-10",1); // Resultará 2007-01-11

      5 – Quantidade de Dias de um Determinado Mês

      Uma vez perguntaram isso em um desses foruns e percebi que poderia ser mais fácil que eu imaginava, fui caça no mktime descobri isso:

      echo date("t", mktime(0, 0, 0, 1, 1, 2007));
      // Retornará a quantida de dias do mês de janeiro do ano de 2007

      0, 0, 0, 1, 1, 2007, Representa 1-1-2007 ou seja, vai pegar a quantidade de dias presentes no mês de janeiro mais verificando o ano para ver se é bissexto

      Detalhe é necessário preencher o dia.

      5 – Finalizando

      A cada função utilizada eu tentei ao máximo inserir um link para a referência oficial do php.net em português, espero que tenham reparado.

      Caso não compreenda alguma função utilize:

      http://br2.php.net/NOME_DA_FUNÇÃO

      Gostaria também de dizer que as funções aqui apresentadas eu utilizo a anos, muitos anos, algumas (a maioria) eu mesmo elaborei, talvez uma eu não me recordo seja de fonte de autoria desconhecida.

      Lembrando também que pode ser que chegue um doido aqui e fale que uma função dessas da para simplificar a uma linha, eu iria ficar feliz.