Prezado Lucasm,
Como a configuração de seu banco de dados exige que a data esteja no formato W3C, para trabalhar com datas no ZF você precisar fazer o seguinte:
Vamos supor que seu formulário post datas nos seguintes formatos '3/8/2008' ou '03/08/2008' .
Ambos os formatos são agradáveis ao usuario mas não compatível com sua base de dados mysql, então no ZF você deve criar um objeto Zend_Date e adicionar a data que recebeu no post, da seguinte forma:
- Código: Selecionar tudo
require_once 'Zend/Date.php';
$dataPostada = '03/08/2008'; //data recuperada via $_GET | $_POST.
$date = new Zend_Date($dataPostada, 'pt_BR');
Pronto você acaba de criar um objeto ZF de data, nesse objeto não importa o formato de data que você postou ou vai precisar ter de saída pois ele
é um objeto do tipo Zend_Date e nesse tipo de objeto todas as datas são timestamp Unix que é um tipo inteiro contendo o número de segundos entre a Era Unix (January 1 1970 00:00:00 GMT) e o tempo especificado.
exemplo:
echo('<pre>');
print_r($date);
- Código: Selecionar tudo
Zend_Date Object
(
[_Locale:private] => Zend_Locale Object
(
[_Locale:private] => pt_BR
[_Codeset:private] =>
)
[_Fractional:private] => 0
[_Precision:private] => 3
[_unixTimestamp:private] => 1217732400
[_timezone:private] => America/Sao_Paulo
[_offset:private] => 10800
[_syncronised:private] => 0
[_dst:protected] => 1
)
Para você recuperar a data no formato W3C necessário para armazenar no seu banco de dados, você deve usar o metodo:
$date->get(Zend_Date::W3C);que irá lhe retornar:
2008-08-03T00:00:00-03:00
Até esse ponto conseguimos receber a data do usuário e converter para o formato exigido pelo mysql.
Vamos agora então criar o processo inverso, recuperar a data do mysql e mostrar para o usuário em um padrão amigável.
Já sabemos que a data é guardada no mysql no formato W3C
2008-08-03T00:00:00-03:00.
Para que possamos manipular essa data e a recuperar nos mais variados formatos precisamos novamente criar um objeto
Zend_Date e passar como argumento a data que recuperamos do banco de dados, da seguinte forma:
$dataRecuperadaMYSQL = '2008-08-03T13:53:25-03:00';
$date = new Zend_Date($dataRecuperadaMYSQL, 'pt_BR');
e podemos recuperar a data no formato que desejamos usando o metodo get():
$date->get(Zend_Date::DATES); = 03/08/2008
$date->get(Zend_Date::DATE_FULL) = domingo, 3 de agosto de 2008;
Veja mais opções de constantes para manipular Datas:
http://framework.zend.com/manual/en/zend.date.constants.html#zend.date.constants.list.table-8Bom, até aqui acho que deu para entender o funcionamento básico do objeto Zend_Date, pois conseguimos receber uma data e a converter para o padrão W3C e guarda-lo na base de dados e fazer o processo inverso também, vamos ver agora como proceder para tratar hora:
Existe muitas maneiras que se pode fazer isso, vou mostar a mais simples e o que mais normalmente acontece de se ter a data separada da hora no cadastro, então para adicionar um tempo (hora:minutos:segundos) a uma data você deve utilizar o metodo set() da seguinte forma:
$date->set('13:53:25', Zend_Date::TIMES);- Código: Selecionar tudo
$date = new Zend_Date('03/08/2008', 'pt_BR');
$date->set('13:53:25', Zend_Date::TIMES);
echo($date->get(Zend_Date::W3C));
Para recuperar a hora use também o get():
$date->get(Zend_Date::TIMES) = 13:53:25
Veja mais opções de constantes para manipular Time:
http://framework.zend.com/manual/en/zend.date.constants.html#zend.date.constants.list.table-5Agora vamos falar um pouco sobre timezone e locale:
Muitas pessoas se confundem muito com essas duas questões, o time zone trata da diferença de horários no mundo e o locale trata da forma como as informações são mostradas pelo mundo a afora, por exemplo:
$date = new Zend_Date('03/08/2008', 'pt_BR'); = 03/08/2008
$date = new Zend_Date('03/08/2008', 'de_AT'); = 03.08.2008
$date = new Zend_Date('03/08/2008', 'en_US'); = Mar 8, 2008
Para entender um pouco mais sobre locale, de uma lida em outro post que fiz tratando dessa questão
http://www.zfbrasil.com/forum/viewtopic.php?f=49&t=68#p285Vamos então voltar a questão do timezone.
Nosso planeta é dividido em muitas partes e cada uma dessas divisões tem um fuso horário diferente veja o mapa para entender melhor:
http://www.lib.utexas.edu/maps/world_maps/timezones_2001.jpgPara configurar o timezone adequado a seu projeto você pode fazer de duas maneiras:
Primeira opção seria adicionar no bootstrap o metodo php date_default_timezone_set('America/Rio_Branco');
A segunda opção seria tratar a questão em nível de objeto que pode ser feito através do metodo setTimeZone():
$date = new Zend_Date('03/08/2008', 'pt_BR');
$date->setTimezone('America/Sao_Paulo');
O Brasil tem varias regiões defininas no como ponto de referência para timezone, segue algumas:
America/Sao_Paulo
America/Rio_Branco
America/Recife
America/Bahia
America/Boa_Vista
America/Campo_Grande
America/Manaus
America/Cuiaba
America/Belem
America/Porto_Acre
America/Porto_Velho
Veja as listas de todas as regiões do mundo:
http://br.php.net/manual/pt_BR/timezones.phpBom acho que isso ajuda um pouco, sei que tem outras questões que posteriormente e conforme a necessidade podemos tratar também, tais como
horário de verão no mundo, amanhecer e entardecer, cálculo de tempo entre duas datas e outras coisinhas mais.
Por hora um forte abraços a todos,
Israel Agoeiro