JSF com data correta, sem considerar horas, sem diminuir um dia

Já li alguns tópicos e abri este pois não consegui resolver:

tenho um campo data de nascimento (no banco é apenas um DATE), não preciso das horas… Ele grava a data certo mas dependendo de que horas são fica mostrando um dia a menos (mesmo estando certo no banco), ou seja, se coloco 05/08/1984 ele mostra 04/08/1984, mesmo estando no banco com 05/08/1984 (é como se as horas deixassem o campo maluco). Já tentei timezone GMT-3, UTC-3…tem como mostrar só a data não considerando diferenças de fusos, na verdade não considerando hora (visto que é uma data de nascimento)?

segue trecho do código:

[code] <h:inputText converterMessage=“A data de nascimento deve ser informada corretamente” requiredMessage=“A data de nascimento deve ser informada.” id=“datanascimento” required=“true” value="#{clienteBean.cliente.dataNascimento}" >

            		<f:convertDateTime pattern="dd/MM/yyyy" timeZone="#{initParam.timezone}" />
			</h:inputText> 

[/code]

Olá amigo,

Já tentou o seguinte?

     <f:convertDateTime pattern="dd/MM/yyyy" timeZone="America/Sao_Paulo"/>

Té mais.

2 curtidas

Olá, mas ele vai considerar o horário de verão? ou funciona para qualquer caso? não vai ficar dependendo da hora do dia não?

desculpa as perguntas mas é que já testei vários timezones, até achei que tinha resolvido com o UTC-3, pois no horário que testei ele parou de mostrar errado mas passou algumas horas e começou a mostrar errado. Percebo diferença principalmente nas horas próximas a virada de outro dia…

Não acho que dependa da hora do dia, pois como você disse a data está correta no banco de dados.

Acredito que seja um problema no momento de exibir a data.

Já tive um problema parecido com o seu, mas com horas e não com datas.

Também havia tentado com timeZone=“UTC-3” e várias outras coisas, mas o que solucionou mesmo o problema foi o timeZone=“America/Sao_Paulo”.

Té mais.

na verdade não queria usar timezone (nem queria tratar horas), como falei é uma data de nascimento que é informada pelo usuário…o timezone se não for citado vai ser utilizado de qualquer forma pelo jeito (de algum lugar, nem que seja o default), que coisa chata, queria somente a data, sem considerar hora visto que nem tem sentido num campo DATE.

mas vou testar. obrigado

se mais alguém tiver solução, agradeço

O que eu acho que pode estar acontecendo é que quando você busca a data do banco para ser exibida, ela é convertida para um objeto java.util.Date com um time zone diferente, o que pode estar reduzindo algumas horas da sua data e consequentemente exibindo um dia a menos no momento da exibição.

Mesmo que o campo do banco de dados seja do tipo DATE (sem armazenar as horas), acredito que no momento em que o Java busca esse campo no banco de dados, o valor recebido é um long que será convertido em um java.util.Date com horas e uma time zone.

Mas então o timeZone=“America/Sao_Paulo” não funcionou?

Té mais.

Você testou no banco e viu se está certa ou não a data que foi gravada no banco?

Olá M@C,

fiz sua indicação e até pensei que havia resolvido mas achei um caso que continuou mostrando doido: 01/01/1998, acabava mostrando um dia antes.

Aparentemente consegui resolver desta forma:

tirei o timezone dos convert e coloquei esta informação no web.xml:

javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE true

mostrou correto como está no banco (lembrando que é um Date no banco e um Date no java, acho que o lixo vem do date do java, visto que não tem horas no banco).

Enfim, parece ter resolvido…obrigado pela ajuda

Lsouza13, as datas estã perfeitas no banco (gravaram erradas quando por minutos coloquei UTC-3, quando tava GMT-3 gravou tudo certinho), problema é só no retorno e nem em todas as datas, é como se tivesse uma “sujeira” de horas que combinada com o fuso do timezone, acaba visualizando errado… só na visualização do componene na tela devido ao timezone (lembrando que antes estava GMT-3)

E ai cluiz,

Que bom que você conseguiu cara.

Não conhecia essa solução, mas nos próximos projetos vou experimenta-la.

Até mais.

É, aparentemente resolveu, meu medo é que falhe dependendo dos horários (ainda acho que tem a ver com o fuso, horário de verão)…

GMT-3: gravava certo e era mostrado errado
UTC-3: grava errado
Parâmetro: até o momento certo

Olá pessoal,

Quando realizo uma consulta no BD por uma data como 10/10/2010 e lá existe um registro assim ele não encontra, somente se eu incrementar em 1 dia (11/10/2010).
Estou com o mesmo problema e só consegui resolver utilizando dentro do converterDateTime o timezone.

<f:convertDateTime pattern="dd/MM/yyyy" timeZone="GMT-3"/>

Mas o caso é que mesmo setando no web.xml

<context-param>  
        <param-name>timezone</param-name>  
        <param-value>GMT-3</param-value>  
    </context-param>

ou utilizando um servlet e utilizando no listenner do web.xml não funciona:

[code]
public class ServletSetTimeZone implements ServletContextListener{

@Override
public void contextDestroyed(final ServletContextEvent sce) {

}

@Override
public void contextInitialized(final ServletContextEvent sce) {
    TimeZone.setDefault(TimeZone.getTimeZone("GMT-3"));
}

}[/code]

<listener-class>br.com.projeto.util.ServletSetTimeZone</listener-class>

Tentei utilizar também o:

<context-param> <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> <param-value>true</param-value> </context-param>

E não rolou. Queria definir uma vez na aplicação apenas. Alguém tem uma luz?

Olá,

a forma que citei realmente resolveu, nunca mais tive problemas (com relação ao problema que levantei):

tirei o timezone dos convert e coloquei esta informação no web.xml:

<context-param> <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> <param-value>true</param-value> </context-param>

Qual a forma de consulta utilizada e qual o tipo no banco, ele está armazenando as horas?

Olá cluiz,

Utilizo querydsl com hibernate/jpa 2 sobre um banco sql server 2012.

Faço uma consulta simples em uma entity Carro do tipo:

[code]
QCarro carro = QCarro.carro;
JPAQuery query = (new JPAQuery(em)).from(carro);

query = query.where(carro.dataInclusao.eq(dataInclusao));[/code]

Sendo o segundo dataInclusao o parametro recebido no metodo que faz a query.

A consulta realiza com sucesso quando informo uma data tipo 10/10/2010 e esta existe no banco, mas apenas se dentro do converter eu definir o timezone:

<p:inputText id="carroData" value="#{carroMB.dataAtivacao}" converterMessage="#{msgs.dataRequired}" > <f:convertDateTime pattern="dd/MM/yyyy" timeZone="GMT-3"/> </p:inputText><br/>

Se eu tirar o timezone e tentar setar um universal, no web.xml conforme dito antes, não funciona. Ele encontrará o mesmo registro apenas se eu adicionar 1 dia (11/10/2010) no inputtext. Aí ele acha o registro (10/10/2010).

Sendo que no banco o tipo está Date, e só existe informação sobre a data, o horario está todo 00:00:000.

*EDIT: Bom, utilizando um simples componente do primefaces o problema não ocorre mais:

<p:calendar value="#{carroMB.dataAtivacao}" />

Se depois descobrir o que ocorre com o converter dentro do inputtext eu posto aí. Obrigado.

Problema resolvido.

O noob aqui não percebeu que estava alterando o web.xml do tipo cópia que o Maven gera no projeto (target).

Só para constar. Abraços