JSF + Date

7 respostas
D

Estou com um problema e gostaria de saber se alguém ja passou por isso. Quando eu digito uma data em um inputText a data é criada com um dia a menos por exemplo se eu digitar 12/04/2006 o JSF cria a data 11/04/2006, já se eu utilizar o calendar do myFaces isso não acontece, abaixo segue o codigo utilizado:

<h:inputText value="#{cliente.dtNascimento}">
<f:convertDateTime pattern=“dd/MM/yyyy”/>
</h:inputText>

7 Respostas

F
Resolvi isto colocando

TimeZone tz = TimeZone.getTimeZone(GMT 0:00);

TimeZone.setDefault(tz);

No init de um servlet que é carregado logo de início.
D

Fiz isso o problema eh que hora funciona hora não funciona.

F

Não utilizei o parâmetro pattern, utilizei dateStyle.

G

Também tive este problema quando setava o “locale” para pt-Br. Então deixei como en-US mesmo, mas com o formato dd/MM/yyyy
Se você criar um conversor, pode setar assim:

dateTimeConverter1.setLocale(new java.util.Locale(“en”, “US”));

dateTimeConverter1.setTimeZone(null);

dateTimeConverter1.setPattern(“dd/MM/yyyy”);
F

No meu caso estou no faces-config.xml com:


pt_BR

E no meu servlet configuro o TimeZone. Agora não sei se nas tentativas só consegui com os dois juntos ou só com o TimeZone, sei que assim como está agora funciona ok.

Mas com o locale-config setado estou tendo problema com a vírgula em campos numéricos, mais detalhes em: http://www.guj.com.br/posts/list/31408.java

M

olá Srs.

tive o mesmo problema e encontrei a solução no seguite tópico:

K
Sei que o post é antigo. Porém nenhuma das respostas é satisfatória (nenhuma delas postadas aqui funciona direito). Infelizmente o conversor do JSF tem mesmo este bug. A única maneira de resolver o problema é dispensar o conversor padrão do JSF e criar um outro. Abaixo eu mostro o exemplo completo:
public class DateConverter implements Converter {

	private DateFormat formata = new SimpleDateFormat("dd/MM/yyyy");	
	
	///Converte o objeto da jspx para gravar no banco de dados.
	public Object getAsObject(FacesContext context, UIComponent component, String value) throws ConverterException {  
		
		Date data = new Date(); 
				
		//pegar o label do componente
		String label = null;
		Map<String, Object> map = new HashMap<String, Object>();
		map = component.getAttributes();
		label = (String) map.get("label");		
		
		try{
			
			if (value.equals("")  || value == null || value.equals(null)){				
				return null;	//isto devolve ao jsf o controle de campos em branco (required=true/false)			
			}
			
			//isto força o formatador a lançar uma exception se a data for inválida
			formata.setLenient(false);
			
			data = formata.parse(value);
			
		}catch (ParseException e) { 			
			throw new ConverterException("Data invalida");
			
		}catch (Exception e){			
			throw new ConverterException("Data invalida");
		}
		
		return data;  
		
	}  
	   
  	//Converte o objeto que vem do banco de dados para ser apresentado na xhtml.
    public String getAsString(FacesContext context, UIComponent component, Object value)throws ConverterException {  
    	if(value == null) return "";  
    	String dataFormatada = null;  
    	dataFormatada = formata.format(((Date) value).getTime());  
    	return dataFormatada;  
    } 
	    
}
No faces-config:
<converter>
  	<converter-id>dateConverter</converter-id>
  	<converter-class>br.bla-bla-bla.converter.DateConverter</converter-class>
 </converter>
Na pagina (aqui JSF 1 - Para a versao 2, a implementação é diferente):
<h:inputText 
	id="dateExample" 
	value="#{bean.dateQualquer}"
	size="10" 
	required="true" 
	maxlength="10" 
	label="Exemplo de data"				
	onkeypress="Mascara(this,Data);"
	converter="dateConverter">							
</h:inputText>
Sei que é redundante, mas aí vai o javascript, que possui várias outras funções além da que estamos explicando acima - bem complet (achei na NET e dei uma melharada):
//para usar: onkeyup="moeda(this).;
 function moeda(z){  
    v = z.value;
    v=v.replace(/\D/g,"")  //permite digitar apenas números
    v=v.replace(/[0-9]{12}/,"inválido")   //limita pra máximo 999.999.999,99
    v=v.replace(/(\d{1})(\d{8})$/,"$1.$2")  //coloca ponto antes dos últimos 8 digitos
    v=v.replace(/(\d{1})(\d{5})$/,"$1.$2")  //coloca ponto antes dos últimos 5 digitos
    v=v.replace(/(\d{1})(\d{1,2})$/,"$1,$2")    //coloca ponto antes dos últimos 2 digitos
    z.value = v;
}

/*
*       Script: Mascaras em Javascript
*/

/*Função Pai de Mascaras*/
function Mascara(o,f){
	v_obj=o
    v_fun=f
    setTimeout("execmascara()",1)
}
        
/*Função que Executa os objetos*/
function execmascara(){
   v_obj.value=v_fun(v_obj.value)
}
        
/*Função que Determina as expressões regulares dos objetos*/
function leech(v){
	v=v.replace(/o/gi,"0")
    v=v.replace(/i/gi,"1")
    v=v.replace(/z/gi,"2")
    v=v.replace(/e/gi,"3")
    v=v.replace(/a/gi,"4")
    v=v.replace(/s/gi,"5")
    v=v.replace(/t/gi,"7")
    return v
}
        
/*Função que permite apenas numeros*/
function Integer(v){
	return v.replace(/\D/g,"")
}
        
/*Função que padroniza telefone ([telefone removido]*/
function Telefone(v){
	v=v.replace(/\D/g,"")                            
    v=v.replace(/^(\d\d)(\d)/g,"($1) $2") 
    v=v.replace(/(\d{4})(\d)/,"$1-$2")      
    return v
}
        
/*Função que padroniza telefone ([telefone removido]*/
function TelefoneCall(v){
	v=v.replace(/\D/g,"")                            
	v=v.replace(/^(\d\d)(\d)/g,"($1) $2")   
	return v
}
        
/*Função que padroniza CPF*/
function Cpf(v){
	v=v.replace(/\D/g,"")                                   
	v=v.replace(/(\d{3})(\d)/,"$1.$2")         
	v=v.replace(/(\d{3})(\d)/,"$1.$2")         
                                                                                                 
	v=v.replace(/(\d{3})(\d{1,2})$/,"$1-$2")
 
	return v
}
        
/*Função que padroniza CEP*/
function Cep(v){
	v=v.replace(/D/g,"")                            
    v=v.replace(/^(\d{5})(\d)/,"$1-$2") 
	return v
}
        
/*Função que padroniza CNPJ*/
function Cnpj(v){
	v=v.replace(/\D/g,"")                              
	v=v.replace(/^(\d{2})(\d)/,"$1.$2")      
	v=v.replace(/^(\d{2})\.(\d{3})(\d)/,"$1.$2.$3") 
	v=v.replace(/\.(\d{3})(\d)/,".$1/$2")              
	v=v.replace(/(\d{4})(\d)/,"$1-$2")                        
	return v
}
        
/*Função que permite apenas numeros Romanos*/
function Romanos(v){
	v=v.toUpperCase()                        
	v=v.replace(/[^IVXLCDM]/g,"") 
                
	while(v.replace(/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3})$/,"")!="")
		v=v.replace(/.$/,"")
	return v
}
        
/*Função que padroniza o Site*/
function Site(v){
	v=v.replace(/^http:\/\/?/,"")
	dominio=v
	caminho=""
	if(v.indexOf("/")>-1)
		dominio=v.split("/")[0]
		caminho=v.replace(/[^\/]*/,"")
		dominio=dominio.replace(/[^\w\.\+-:@]/g,"")
		caminho=caminho.replace(/[^\w\d\+-@:\?&=%\(\)\.]/g,"")
		caminho=caminho.replace(/([\?&])=/,"$1")
	if(caminho!="")dominio=dominio.replace(/\.+$/,"")
		v="http://"+dominio+caminho
	return v
}

/*Função que padroniza DATA*/
function Data(v){
    v=v.replace(/\D/g,"") 
    v=v.replace(/(\d{2})(\d)/,"$1/$2") 
    v=v.replace(/(\d{2})(\d)/,"$1/$2") 
    return v
}

        
/*Função que padroniza HORA*/
function Hora(v){
	v=v.replace(/\D/g,"") 
	v=v.replace(/(\d{2})(\d)/,"$1:$2")  
	return v
}
        
/*Função que padroniza valor monétario*/
function Valor(v){
	v=v.replace(/\D/g,"") //Remove tudo o que não é dígito
	v=v.replace(/^([0-9]{3}\.?){3}-[0-9]{2}$/,"$1.$2");
	//v=v.replace(/(\d{3})(\d)/g,"$1,$2")
	v=v.replace(/(\d)(\d{2})$/,"$1,$2") //Coloca virgula antes dos 2 últimos digitos
	return v
}
        
/*Função que padroniza Area*/
function Area(v){
	v=v.replace(/\D/g,"") 
	v=v.replace(/(\d)(\d{2})$/,"$1.$2") 
	return v
                
}

Espero ter ajudado aos amigos do GUJ.
Também aprendo muito aqui.
fui...

Criado 19 de abril de 2006
Ultima resposta 9 de fev. de 2012
Respostas 7
Participantes 5