terça-feira, 29 de setembro de 2015

Série PHP: Trabalhando com data e hora

Seu aplicativo precisa de informações de data e horário? Precisa de funções que façam operações com o calendário e o registro do tempo?
Sem problemas! O PHP oferece os recursos necessários para aplicações desse tipo através dos elementos Date (data) e Time (tempo). Você pode os métodos relacionados para, por exemplo, exibir a a data e hora corrente em diversos formatos, registrar exatamente quando o usuário fez login no sistema, quando uma compra foi efetuada, quantos dias faltam para o lançamento de um novo produto, quantos dias se passaram desde tal evento até o momento etc.
São muitos recursos e nós vamos ver aqui os principais.


Exibição prática de data

Em uma página em php, escreva o código seguinte para exibir a data atual:

<?php
   $hoje = date('Y/m/d');
   echo $hoje;
?>

O aplicativo irá exibir exatamente a data atual fornecida pelo servidor.

No caso acima, abrimos e fechamos o código com as tags da linguagem php; criamos a variável $hoje e para seu valor, atribuímos o método que chama a data (date) configurada para o ano (Y), o mês (m) e o dia corrente (d). Depois, publicamos (echo) a variável, que então exibirá a data de hoje, no caso aqui, mostrando:

2015/09/29

Veja que os parâmetros (ano, dia e mês) foram separados por uma barra, conforme é o nosso padrão. De outra forma, você poderia usar espaço, vírgulas ou traço para fazer essa separação.

date('Y m d') = 2015 09 29
date('Y, m, d') = 2015, 09, 29
date('Y-m-d') = 2015-09-29

Se não usar separador, os dígitos aparecerão juntos:

date('Ymd') = 20150929

Vemos que o dia foi representado pela letra d, o mês pela letra m e o ano pela letra Y. Essas descrições são estabelecidas pelo sistema, mas há outras descrições possíveis, por exemplo, chamar o mês pelo nome (setembro), em vez do numeral (09); descrever o dia da semana (terça-feira). É possível! Basta apenas usar o caractere referente ao parâmetro.
Veja a seguir, uma tabela com os formatos para datas:

Dia (day)
d - dia com preenchimento de zero = 01, 02... 10... 31
j - dia sem preenchimento de zero  = 1, 2, 3... 20... 31
D - dia textual abreviado = Seg, ter... dom
l (L minúsculo) - dia textual = Segunda-feira... Sábado, Domingo

Mês (Month)
m - mês com preenchimento de zero = 01... 05... 11, 12
n - mês sem preenchimento de zero = 1, 2... 10, 11, 12
M - mês textual abreviado = Jan, Fev... Nov, Dez
- mês textual = Janeiro... Junho... Dezembro

Ano (Year)
Y - ano completo = 1975... 1999, 2000... 2012... 2015
y - ano abreviado = 12 (2012)... 15 (2015)...

Vamos a um novo exemplo:

<?php
   $hoje = date('l, d, M, Y');
   echo 'Hoje é ' . $hoje;
?>

Fizemos o seguinte: declaramos a variável $hoje com o valor da função que puxa a data (date) pelos parâmetros do dia textual (l) mais o mês textual abreviadol (M) e o ano completo (Y); depois exibimos uma linha de texto ('Hoje é ') concatenado (.) com o valor da variável $hoje.
O meu resultado foi:

Hoje é Terça-feira, 29, Set, 2015


Exibição prática da hora

Para exibir a hora certa, basta acrescentar os parâmetros adequados na declaração da função da data (date), no caso, para hora, para minutos e  para segundos. Veja:

<?php
   $tempo = date('d/M/Y, H:i:s');
   echo $tempo;
?>

O que veremos é algo do tipo:

29/Set/2015, 15:51:04


Salvando data no Banco de Dados (formato internacional)

ATENÇÃO: o formato correto para salvar data em um banco de dados é conforme o padrão internacional (formato americano), cuja ordem é inversa da que usamos no Brasil. Enquanto usamos a sequência dia, mês e ano, o padrão internacional usado para salvar o registro de hora em um BD é year, month, day, ou seja, ano, mês e dia.

Inclusive, esse sistema é -- devemos reconhecer -- é mais inteligente que o nosso, pois faculta literal e corretamente uma ordem crescente e decrescente. Por exemplo, se você pegar os valores literais das datas 3 de julho de 2025 e 29 de junho de 2010, literalmente, você compreenderá que a segunda data tem um valor maior e, numa ordem crescente, posterior que a primeira data fictícia, pois, já pelo valor do dia (3 e 29), teríamos um desajuste na ordem, uma vez que o dia 3 é menor que 29, embora pelo valor do ano respectivo de cada qual seria o contrário (2025 é maior que 2010). Já no padrão internacional, isso nunca ocorre, pois a ordem começa pelo ano, depois pelo mês e por último o dia.

Então, se você precisa salvar uma data escrita no nosso formato num BD, será preciso converter para o padrão internacional (de dia/mês/ano para yearr/month/day). Mas, sem problemas! Basta usar o código conversor adiante:

$hoje = 29/09/2015;
$convert = implode("-", array_reverse(explode("/", $hoje)));

Então o BD receberá a data convertida pronta para ser salva como: 2015-09-29

Por outro lado, se a data está salva no BD (no padrão internacional: ano, mês, dia), e você precisa mostrá-la no nosso padrão (de yearr/month/day para dia/mês/ano), use o código a seguir:

$bd = xxxx/xx/xx // variável com o registro do BD
$convert = implode("/", array_reverse(explode("-", $data)));
echo $convert;

Então o resultado será: 29/09/2015


Configurando a localidade

Bem, mas o servidor do seu site pode estar configurado com os dados de outra localidade, dando diferença na hora certa de sua cidade. Nesse caso, será preciso configurar a zona do tempo.
Então, usamos o date_default_timezone_set:

<?php
   date_default_timezone_set('America/Sao_Paulo');
   $tempo = date('d/M/Y, H:i:s');
   echo $tempo;
?>

A hora será exibida pelo local estabelecido (no caso aqui, definimos o horário da cidade de São Paulo).
Ah, outra coisa, talvez a descrição textual do dia semana e do mês também não esteja de acordo com o nosso português, sendo então impresso as datas em inglês (Monday, Sunday, January, September etc.).
Bom, só para garantir, você pode fazer um truquezinho para converter os valores dos parâmetros e assim traduzir as descrições.
Eis um exemplo:

<?php
    $data = date('D');
    $mes = date('M');
    $dia = date('d');
    $ano = date('Y');
    
    $semana = array(
        'Sun' => 'Domingo', 
        'Mon' => 'Segunda-feira',
        'Tue' => 'Terça-feira',
        'Wed' => 'Quarta-feira',
        'Thu' => 'Quinta-feira',
        'Fri' => 'Sexta-feira',
        'Sat' => 'Sábado'
    );
    
    $mes_textual = array(
        'Jan' => 'Janeiro',
        'Feb' => 'Fevereiro',
        'Mar' => 'Março',
        'Apr' => 'Abril',
        'May' => 'Maio',
        'Jun' => 'Junho',
        'Jul' => 'Julho',
        'Aug' => 'Agosto',
        'Nov' => 'Novembro',
        'Sep' => 'Setembro',
        'Oct' => 'Outubro',
        'Dec' => 'Dezembro'
    );
    
    echo $semana["$data"] . ", {$dia} de " . $mes_textual["$mes"] . " de {$ano}";
?>

O resultado será:

Terça-feira, 29 de Setembro de 2015

O que fizemos dessa vez foi separar os parâmetros do dia, mês e ano, declarando-os em variáveis diferentes.
Para a descrição textual da semana, criamos a variável $semana com uma tabela de valores (array) que verte a abreviação dos dias da semana em inglês para português. Quando então essa variável é chamada, ela pega o valor do dia atual contido na variável $data e traduz para o valor correspondente.
Semelhante ao truque da descrição textual do dia da semana, fizemos com a descrição textual do mês, que configuramos pela array declarada na variável $mes_textual.

Mais especificações, consulte o manual online do PHP clicando aqui.

Nenhum comentário:

Postar um comentário