Solicito vossa ajuda para um problema estranho que está me ocorrendo.
Vejam o seguinte codigo na minha pagina .xhtml:
<h:inputText value="#{cadastroUsuarioManagedBean.usuarioTo.dataNascimento}" styleClass="input-data" id="inputDataNascimentoComprador" name="inputDataNascimentoComprador" style="width: 100px;" required="true" requiredMessage="Informe sua Data de Nascimento." >
<f:convertDateTime pattern="dd/MM/yyyy" />
</h:inputText>
A princípio, nada anormal, uma vez que o valor digitado de fato está sendo convertido.
No entanto, a data sempre está chegando ao meu atributo com um dia a menos do que digitei. Se digito 02/01/2010, vem a data 01/01/2010…se digito 01/01/2010, vem a data 31/12/2009…
Algum motivo pra ele estar se comportando dessa forma?
Obrigado, caro Requena. De fato, setar o timezone da tag <f:convertDateTime> resolveu.
No entanto, creio que esse seja um pequeno bug (ai,ai…) da implementação do JSF. Estou usando a versão 1.2.13.
O que ocorre:
Dei uma olhada no fonte da classe DateTimeConverter (jsf-api.jar) e vi que por default o timezone utilizado para a conversão é GMT
private static final TimeZone DEFAULT_TIME_ZONE = TimeZone.getTimeZone("GMT");
Pois bem, fiz uns testes em separado retornando o método TimeZone.getDefault() e o retorno foi GMT-03:00
Portanto, se eu fixar esse timezone na pagina, o resultado da conversão fica correto.
Acredito que o correto seria a implementação do JSF usar esse método (TimeZone.getDefault()), ao invez de fixar o GMT. Por sinal, como não sou entendido de tais, códigos, alguem saberia dizer se esse GMT-03:00 é devido ao horário de verão?Ou realmente é o correto para aplicações executando no nosso Locale?
Pergunto porque, se esse retorno for mesmo devido ao horário de verão, não poderei fixá-lo na página
Tipo esse default se nao me engano pega o fuso horario setado no servidor então tipo no seu relógio deve estar gmt -3 ai ele pega esse fuso horario e tb seta para o horario de verao…entao tipo estando no horario de verao ele vai pegar o fuso do cara que digitou tipo gmt alguma coisa +(gmt -3h +1hora de verao) acho que é isso…
Obrigado novamente…me parece que o que voce disse procede. Dei uma olhada aqui na configuração de data/hora da máquina e ele está usando GMT-03:00, que é o horário de Brasília…entao acho que é correto usar esse valor.
De qualquer forma, o que fiz foi o seguinte…criei uma classe que extende DateTimeConverter e registrei essa classa no faces-config.xml como um converter…e no construtor desse cara eu defino o timezone com o retorno de TimeZone.getDefault(). Espero que não seja uma gambiarra muito feia :lol:
Obrigado pela ajuda Requena, e a todos que visitaram o tópico.