Datas, a solução ou o começo dos problemas!

Posted on Dezembro 29th, 2005 by João Vagner Brito de Medeiros, under Desenvolvimento web, Geral.

Bom dia,

Datas, hora, minutos, meses, anos, informações que nos deslocam às nossas tarefas diárias, ou que nos deixam desesperados porque o tempo é pouco para tal coisa ou compromisso, pois é, data esta dentro do tempo, que nem sempre esta à nosso favor. Deixa-mos a filosofia de lado, blá nunca fui bom filosófo, quer dizer, jamais fui um, então comecemos logo à entender um pouco datas.

Formatos de datas no Mundao!

O php, a linguagem de inicio que vou usar nesse post, tem a função strftime(), ela faz a formatação de uma hora/data com as configurações locais dos paises, é importante frisar que em servidores windows, é preciso usar a função setlocale() para definir a linguagem da localidade que você vai usar, e ler no MSDN as suportadas, porque claro, o Windows complica mais do que ajuda!

Exemplo de datas com fuso horario de outros paises

Alemanha

<?php
//Seta o local, de_DE = alemanhã (German)
setlocale(LC_TIME, "deu");
echo strftime(" estamos na  German (Alemão) %A.\n");
?>

Portugues Brasil

<?php
//Seta o local, "portuguese-brazil" ou "ptb" = Português Brasil
setlocale(LC_TIME, "portuguese-brazil");
echo strftime(" estamos no Brasil  (Português) %A.\n");
?>

Formas de String:

%a - dia da semana abreviado de acordo com a localidade
%A - nome da semana completo de acordo com a localidade

Mais sobre as formas de string em PHP.Net ( Manual).

Bom, agora que a parte de deixar configurado à data de acordo com sua localidade ou com a necessidade mesmo do desenvolvedor, por exemplo se você estiver trabalhando em um sistema que poderá ser usado em outros paìses (nossa, elevei o pessoal a programadores mundiais!), isso pode poupar-lhe de muita dor de cabeça, gritos, socos, murros, monitores, gabinetes, e HD’s!

Datas em formato Timestamp

An extension of the DATE datatype that can store date and time data (including fractional seconds). The timestamp type takes 11 bytes of storage.

Inglês péssimo né? é? então eu vou lhe dar uma linguada básicanisso e verbalizar essa budêga:

Uma extensão do datatype (tipo de data) da DATA que pode armazenar dados da data e da hora ( com segundos fracionários incluídos).  O tipo do timestamp faz exame de 11 bytes de  armazenamento..

Nossa, meu inglês é uma bosta também, mas o português tambem é fraco, mas é isso. é uma extenção de data para armazenamento de data hora e informações facionarias como segundos, blá e blá, se você quiser uma data exata mesmo, no real sentido, isso é sua solução!

Timestamp em MySQL e outros tipos

O Nosso Manual MySQL nos diz, que DATETIMES e TIMESTAMP são relacionadas, calma, elas não tem relações sexuais, vão ter datazinhas gritando, chorando e chamando você de titio não! nossa, mente poluída a minha não?! Elas são apenas parecidas, ou tem a mesma função, até hoje nunca descobri, ou tenho certeza disso! hahahaha!

Os formatos de DATE do MySQL se reservam apenas à Ano, dia e Mês: YYYY-DD-MM, não temos a opção de segundos fracionários, então neca de comparação exata usando segundos com esse tipo de campo.

Agora em Timestamp como diz a descrição da extenção, temos opção fracionária, que ficará no formato de: YYYY-DD-MM HH:MM:SS, po, mas ta feio pacas isso não? Os Brasileiros não leem datas nesse formato americano, então o MySQL permite usar o padrão de data Brasileiro ? que é DD-MM-YYYY, cara, sei não, se tiver desconheço, e não recomendo! já vou explicar os motivos.

Imagine essa  situação:

Você tem 2 datas, que precisam ser comparadas se uma é maior que outra , as datas são essas: 23/06/1989 e 23/08/1800, e em comparações de datas você não pode usar barras, traços, essas viadagens todas pra ficar bonitinha! Seria assim seu pensamento:

23061989 > 23081800  vai retornar false, hahah se lasco cara!

Bom, olhando você ja sabe que a data mais antiga é maior que a mais nova, no nosso formato Brasileiro, mas isso esta errado, sendo que a primeira data é a maior, sendo à mais perto de nosso ano atual, não é? mas os numeros não mentem, porque nosso formato é incorreto para comparações de data, mas no formato americano é mais fácil de se comparar:

18002308 > 19892308 vai retornar true.

Mas você ficou tristinho, pois a data no formato americano fica estranho pros brasileiros, calma, tudo tem uma solução, você pode formatar a data em timestamp com uma funçãozinha que o Prog me ajudou a criar! ela fica em um formato bunitinho exemplo: 23 de outubro de 2004 as 13:01:21 . mas caso os dados venham do banco de dados, é necessário usar UNIX_TIMESTAMP antes no seu select, por exemplo:

# Seleciona o campo data, usando a função UNIX_TIMESTAMP, dando renome a ela, de NovaData, campo esse da tabela TabelaLinda
SELECT UNIX_TIMESTAMP(data) as NovaData from TabelaLinda;

Se você chamar a função UNIX_TIMESTAMP sem nenhum argumento, exemplo:

# Obtem a data de hoje usando os segundos, desde de 1970!
SELECT UNIX_TIMESTAMP();

Isso iria retorna um tipo timestamp do Unix, são segundos desde ‘1970-01-01 00:00:00′ GMT, mais ou menos assim: 882226357

Bom, ai você tem um monte de numeros de segundos, o que você vai fazer com eles? colocar no prato e comer? Jogar na lata do lixo porque não serve pra nada? Pegar uma metralhadora e atirar no monitor (Isso claro, antes do referendo do desarmamento xxxxxx que está pra acontecer),  ou usa a função do João com o prog?, ahhh garoto esperto, usa a função!

<?php
function montaData($data) {
 $v_mes = array(1=>"Janeiro","Fevereiro","Março","Abril","Maio","Junho","Julho","Agosto","Setembro","Outubro","Novembro","Dezembro");
 $v_data = explode(" ",date("Y m d H i s", $data));
 return "{$v_data[2]} de {$v_mes[(int)$v_data[1]]} de {$v_data[0]} as {$v_data[3]}:{$v_data[4]}:{$v_data[5]}";
}
?>

Fico Bunitinha! hahaha, na aplicação:

<?php
echo montaData($consulta['NovaData']);
// retorna data linda, gostosa e cheirosa o.O
// 23 de outubro de 2005, as 13:13:13
?>

Agora quando você define no seu campo tipo Timestamp? como deve inserir o formato das datas lá? Putzzz, agora sim, dá tiro no monitor! brincadeirinha, faz isso não cara, monitor hoje em dia esta um absurdo! Você usa o padrão americano uai, temos outra função pra isso, pra em vez de se matar escrevendo date() e suas propriedades, só chama a função PadraoData().

<?php
function padraoData() {
$exibe = date('Y m d H i s');
return $exibe;
}
?>

Se você mandar imprimir date(’Y m d H i s’); vai ver que vai sair: YYYY MM DD HH II SS, não as letras, mas a data mesmo! que é o padrão americano, em timestamp! Em comparações isso fica mais perfeito ainda, não foge nem os segundinhos!

20041512030520  >  20031810122030 retorna  true

20031810122030 > 20041512030520   retorna  false

Índices para Pesquisa

 

Abraços ;-)

 

One Comment

Thomas  on Maio 18th, 2006

haahahahahahha

Muito bom o post João, excelente BLOG o seu, meus parabéns.

Um abraço!

Leave a Comment