PHP, Manipulando Datas (+Horas)

Procurando curso de PHP e MySQL ? 

http://treinamentos.visure.com.br/treinamentos/php-mysql-programacao-web.html

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 emex: 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.


15 Comentários on “PHP, Manipulando Datas (+Horas)”

  1. Paulo disse:

    Meu amigo eu tenho uma dúvida, eu administro um site de uma equipe de futebol society, e lá tem uma página é a agenda de jogos, na página principal eu gostaria de colocar um rotina que aparecesse somente o jogo daquela semana, pois só tem jogos aos domingos.

    vlw

  2. A certo, os passos a serem seguidos são:

    1: Obter o dia atual.
    2: Ter consciência que no seu caso a semana começa na segunda
    3: Consequentemente a semana termina no domingo
    4: Obter o dia que será no sábado daquela semana:
    5: No MySQL o campo data deverá ser do tipo DATE ou DATETIME

    Sendo assim:

    $data = date(“Y-m-d”);
    $semana = date(“w”); // Nº da Semana Atual
    $semana = ($semana == 0) ? 7 : $semana;
    $dias = 7 – $semana; // Qtde dias faltam para domingo

    $final = dtSomar($data,$dias); // Usando a função do post

    // VAMOS AO BANCO DE DADOS

    $sql = “select * from tabela
    where CAMPO_DATA between ‘”.$data.”‘ and ‘”.$final.”‘”;

    —————————–
    Espero ter ajudado.
    Talvez você possa obter formas mais fáceis de fazer isso.

  3. Paulo disse:

    Vlw, vou verificar.

  4. Paulo disse:

    Meu amigo o problema está nesta parte

    $semana = ($semana == 0) ? 7 : $semana;
    $dias = 7 – $semana; // Qtde dias faltam para domingo

    $final = dtSomar($data,$dias); // Usando a função do post

    Pois eu colocar da forma abaixo da certo.
    “select * from agendaseg
    where data between ‘2007-03-25′ and “2007-04-10’ order by data desc limit 0,1;

    com o codigo que vc colocou a tela fica branca.

  5. Olá,

    O código foi testado aqui, e está funcionando perfeitamente, é simples fazer o teste, basta você:

    echo $data; // Tem que aparecer o dia atual no formato YYYY-mm-dd
    echo $final; // Tem que aparecer o dia + n no formato YYYY-mm-dd
    echo $sql; // No seu caso acho que é echo $busca, bom se entendeu.
    die();

    Verifique os 3 itens ai sim voce vai saber ao certo o que está errado.

  6. José Carlos disse:

    Bom dia,

    desenvovi uma classe que trabalha com data, e nela tenho um método “dataPassada” ela é similar a sua função “dtSomar” a diferença é passo passar por parametro data, dia, mês, ano, hora, minuto e segundo e assim calcular uma data passada
    só que tive um problema, a data atual é 30/03/2009 e estava querendo calcular a data de um mês atraz, ou seja, data atual – 1 mês

    so que o meu método retornou a data 02/03/2009 isso ocorreu porque o mês passado teve 28 dias, e pra minha aplicação funcionar é preciso retornar no minimo o ultimo dia do mês passado

    veja meu método:

    public function dataPassada ($data = “”, $qtd_dia = 0, $qtd_mes = 0, $qtd_ano = 0, $qtd_hora = 0, $qtd_minuto = 0, $qtd_segundo = 0) {

    if (empty($data))
    $data = date(“Y-m-d”);

    $ano = substr($data, 0, 4);
    $mes = substr($data, 5, 2);
    $dia = substr($data, 8, 2);

    return date(“d/m/Y”, mktime(0 – $qtd_hora, 0 – $qtd_minuto, 0 – $qtd_segundo, $mes – $qtd_mes, $dia – $qtd_dia, $ano – $qtd_ano));

    }

  7. José Carlos disse:

    A principio irei verificar se o mês retornado é igual ao mês da data atual… caso seja irei chamar o método novamente, assim ele me retorna a data 02/02/2009 irei deixar assim até encontrar uma solução mais inteligente… caso alguém tenha comente.
    Obrigado

  8. Elaine Naomi disse:

    Nossa! Valeu !! Muito bom o post!!

  9. Frank Darela disse:

    Boa Tarde
    Muito bo esse seu post, simples e eficaz, ajuda muito, valeu pela iniciativa.
    Agora tem uma coisa, eu fix un script em java para calcular a diferença entre datas, mas não consigo fazer o mesmo em php, voce poderia me dar uma luz.
    Tipo assim eu tenho duas datas, e quero a quantidade de dias entre elas, mas não consigo fazer em php, da uma força ai colega.

    Você pode ver o meu em java no site http://www.pousadacampingfarol.com.br/reservas_dia.php

    Beleza

    Valeu

  10. valeu pela ajuda! estava com um problema aqui e resolveu certinho!

  11. Mario Arroyo disse:

    Olá, amigo!

    Para converter uma data do formato utilizado pelo MySQL para o formato convêncional adotado no Brasil, basta utilizar a função nativa strtotime() (que converte a data para o formato UNIX).

    $mysql_date = ‘2010-05-28’; //Y-m-d.
    $br_timestamp = date(‘d/m/Y’, strtotime($mysql_date));

    echo $br_timestamp; //O resultado será exatamente 28/05/2010.

    Com isso você evita a utilização dos comandos explode() e tudo o mais.

    []’s
    Mario Arroyo

  12. Felipe disse:

    Amigao blz?
    seguinte: to fazendo um site preciso de uma ajuda numa função:
    exemplo:
    $data_entrada=’04/07/2010′;
    $data_saida=’04/07/2012′;
    quero que mostre os dias que ele tem restante:
    731 dias no caso. mas a cada dia que passa deve subtrarir 1 dia dos 731.
    obrigado aguardo!
    felipe.s.n@hotmail.com

  13. Primeiro demais seu blog, parabéns…tenho uma dúvida..possuo uma tabela de dias, horas e programas ao qual a cada 2 horas entra um programa novo. Preciso “puxar” as informações pelo dia da semana e hora do dia. Qual seria o melhor caminho ?

    Grato

    Ed Rodrigues

  14. Andre disse:

    Cara, muito bom seus comandos me ajudaram demais, agora gostaria de aproveitar e perguntar uma coisa, como eu faria para resgatar de todos meus registros no banco a quantidade de pessoas que tem até 18 anos ?

    Obrigado!

  15. Jessé disse:

    Galera bom dia… preciso mostrar a data do sistema em um relatório no FPDF até ai tudo bem consegui mas ela ta aparecendo no formato dd/mm/aaaa mas preciso que ela fique por extenso já que é uma declaração por exemplo: ” 17 de Dezembro de 2014″ alguma dica de como fazer isso??


Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s