Como converter Data para o Formato Brasileiro

09/04/2009

Olá, pessoal, bem essa semana eu me deparei com o problema da Data. onde eu consigo salvar no banco de dados de forma normal . Mas quando ela volta, volta no formato 1996-05-22 e gostaria que ela ficasse no padrão Brasileiro (dd/MM/yyyy)

if (acao.equalsIgnoreCase("usuario.consultar")) {
   String campo = request.getParameter("campo");
   String valor = request.getParameter("valor");
   int tipo = Integer.parseInt(request.getParameter("tipo"));
    
   Vector usuariosRetornados = UsuarioDao.consultaUsuarios(campo,
				valor, tipo);
   if (usuariosRetornados.size() > 0) {
                request.getSession(true).setAttribute("usuarios",	   	       usuariosRetornados);
	response.sendRedirect("consulta_usr_retorno.jsp");
    } else {
	request.getSession(true).setAttribute("tipomsg", "falha");
                request.getSession(true).setAttribute("msg",
	           "Não houveram usuarios encontrados");
   	            response.sendRedirect("msg.jsp");
   }
			
}
Classe Dao

public static Vector consultaUsuarios(String campo, String valor,int tipoPesquisa)  {
    String sql = null;
    switch (tipoPesquisa) {
      case PESQUISA_INICIAL:
     sql=" select * from USUARIO where "+campo+" like '"+valor+"%' order by "+campo+" asc";
        break;
      case PESQUISA_CONTEM:
        sql= "select * from  USUARIO where "+ campo+"  like '%"+valor + "%' order by "+campo+" asc";
        break;
      case PESQUISA_TERMINA:
        sql = "SELECT * FROM USUARIO WHERE "+ campo+" like '%"+valor + "' order by "+campo+" asc";
        break;
      case PESQUISA_EXATO:
        sql = "SELECT * FROM USUARIO WHERE "+ campo+"='"+valor + "' order by "+campo+" asc";
        break;
    }
    setup();
    try {
      Statement qry = conn.createStatement();
      ResultSet rs = qry.executeQuery(sql);
      
      Vector retorno = new Vector();
      Usuario usuario = null;
      while (rs.next()) {
        usuario = new Usuario();
        usuario.setCodigo_Usuario(rs.getInt(1));
        usuario.setNome_Usuario(rs.getString(2));
        usuario.setLogin_Usuario(rs.getString(3));
        usuario.setSenha_Usuario(rs.getString(4));
        usuario.setData_Nascimento(rs.getDate(5));
        usuario.setEmail_Usuario(rs.getString(6));
        usuario.setObservacao(rs.getString(7));
                       
        retorno.add(usuario);

      }
      return retorno;
    }
    catch (SQLException ex) {
      ex.printStackTrace();
      return null;
    }
  }
  
Gostaria de saber qual é uma forma bem simples de fazer essa transformação. Obrigado pela atenção.. Um abraço Marcus Paulo

Marcus Melo

Respostas

09/04/2009

Moacy Jr.

olha marcos vc pode muito bem utilizar essa data q vem do banco... mas vc terá que formata-la com SimpleDateFormat. dá uma pesquisada aqui no forum q o q não falta é discussão sobre este assunto. :!:
Responder Citar

09/04/2009

Marcus Melo

Se vc. está usando JDBC (claro que está... ;-) ), então o método [i]getDate[/i] de um objeto ResultSet retorna o valor do campo como um objeto java.sql.Date (que por sua vez é filho de java.util.Date). Tudo o que vc. precisa fazer para converter esse objeto em uma representação textual ao seu gosto é, como o [b]mbjunior[/b] falou, usar as facilidades de formatação do pacote java.text, no caso o a classe abstrata DateFormat e sua principal implementação, a [b]SimpleDateFormat[/b]: ela permite criar um objeto que converte datas baseando-se em uma máscara que vc. especifica no construtor. Ex.:
. . .

   DateFormat df = new SimpleDateFormat("ddMMyyyy");

   //Atenção para isto:
     df.setLenient(false);

   ResultSet rs = this.conexao.createStatement().executeQuery("SELECT data from tabela");

   while(rs.next()){
       String minhaData = df.format(rs.getDate(1));
       System.out.println(minhaData);
   }

   . . .
Tem uma coisa importante nesses casos... Vc. viu a linha onde usamos o método setLenient()? Ela é necessária pq o SimpleDateFormat, por default, quando não consegue traduzir o valor recebido em uma data válida, converte a coisa para a data válida mais próxima. Isso é legal quando estamos validando entradas de usuário, pq "conserta" datas mal especificadas. No caso de recuperação de banco de dados, é muito comum dependendo do banco, aparecer uma data "correta" do ponto de vista do formato do BD, mas que não é uma data válida (ex.: 00-00-0000). Ao receber uma aberração dessas o SimpleDateFormat vai tentar transformar em uma data "correta" e olha o estrago feito! Para evitar isso, passamos [b]false[/b] para o método [i]setLenient()[/i], desbilitando esse comportamento. Assim o método [i]format()[/i] passa a lançar uma exceção caso a data recebida não seja uma data válida. Para mais detalhes sobre essas classes, consulte o javadoc para: [b]java.text.DateFormat[/b] [b]java.text.SimpleDateFormat[/b] Seria bom também conhecer melhor as classes: [b]java.util.Calendar[/b] [b]java.util.GregorianCalendar[/b] [b]java.util.Date[/b] (veja que criar um objeto dessa classe diretamente está depreciado) [b]java.sql.Date[/b] Você vai aprender bastante sobre esse assunto que é muito importante para qualquer tipo de aplicação! :!: []s
Responder Citar

09/04/2009

Marcus Melo

Em tempo: Também existe uma forma de obter uma instância de java.text.DateFormat já formatada para uma região específica, encapsulada em um objeto java.util.Locale:
      DateFormat df = DateFormat.getInstance(DateFormat.LONG, new Locale("pt", "BR"));
No caso de haver uma instância disponível no DateFormat decente para a nossa região (não testei). Se que existem localidades pré-definidas na classe Locale (como Locale.FRENCH, ou Locale.KOREAN), seria bom que existisse um Locale.BRAZIL. Vamos bater panela, gente!
Responder Citar

09/04/2009

Marcus Melo

este pacote é bem prático para gravação e recuperação de datas:

package br.rgi.ueg;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

/**
 * Esta classe contém métodos para efetuar conversão de datas entre os formatos ISO (yyyy-MM-dd) e ABNT (dd/MM/yyyy).
 * Estes métodos são voltados pra agilizar a gravação e recuperação de datas em Bancos de Dados MySQL.
 */

public class ConvData
{
   private SimpleDateFormat formatIso;
   private SimpleDateFormat formatBra;
   private Date date;

   public ConvData()
   {
      formatIso = new SimpleDateFormat("yyyy-MM-dd");
      formatBra = new SimpleDateFormat("dd/MM/yyyy");
   }

   /**
    * Converte uma data no formato ABNT em formato ISO;
    * @param dataBra Argumento que recebe data no formato ABNT(dd/MM/yyyy);
    * @return Uma data no formato ISO(yyyy-MM-dd).
    */

   public String parseDataIso(String dataBra)
   {
      try 
      {
         date = formatIso.parse(dataBra);
         return(formatIso.format(date));
      }
      catch(ParseException e) 
      {
         e.printStackTrace();
         return("Parse Date Error");
      }
   }
      
   /**
    * Converte uma data no formato ISO em formato ABNT;
    * @param dataIso Argumento que recebe data no formato ISO(yyyy-MM-dd);
    * @return Uma data no formato ABNT(dd/MM/yyyy).
    */

   public String parseDataBra(String dataIso)
   {
      try 
      {
         date = formatBra.parse(dataIso);
         return(formatBra.format(date));
      }
      catch(ParseException e) 
      {
         e.printStackTrace();
         return("Parse Date Error");
      }
   }
}
Responder Citar

09/04/2009

Ricardo Longa

este pacote é bem prático para gravação e recuperação de datas:

package br.rgi.ueg;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.text.ParseException;

/**
 * Esta classe contém métodos para efetuar conversão de datas entre os formatos ISO (yyyy-MM-dd) e ABNT (dd/MM/yyyy).
 * Estes métodos são voltados pra agilizar a gravação e recuperação de datas em Bancos de Dados MySQL.
 */

public class ConvData
{
   private SimpleDateFormat formatIso;
   private SimpleDateFormat formatBra;
   private Date date;

   public ConvData()
   {
      formatIso = new SimpleDateFormat("yyyy-MM-dd");
      formatBra = new SimpleDateFormat("dd/MM/yyyy");
   }

   /**
    * Converte uma data no formato ABNT em formato ISO;
    * @param dataBra Argumento que recebe data no formato ABNT(dd/MM/yyyy);
    * @return Uma data no formato ISO(yyyy-MM-dd).
    */

   public String parseDataIso(String dataBra)
   {
      try 
      {
         date = formatIso.parse(dataBra);
         return(formatIso.format(date));
      }
      catch(ParseException e) 
      {
         e.printStackTrace();
         return("Parse Date Error");
      }
   }
      
   /**
    * Converte uma data no formato ISO em formato ABNT;
    * @param dataIso Argumento que recebe data no formato ISO(yyyy-MM-dd);
    * @return Uma data no formato ABNT(dd/MM/yyyy).
    */

   public String parseDataBra(String dataIso)
   {
      try 
      {
         date = formatBra.parse(dataIso);
         return(formatBra.format(date));
      }
      catch(ParseException e) 
      {
         e.printStackTrace();
         return("Parse Date Error");
      }
   }
}
Este código é excelente, bem organizado e simples, porém, existem dois pequenos erros em cada função. Na função "parseDataIso" altere a primeira linha apenas para Bra:
date = formatBra.parse(dataBra);
return(formatIso.format(date));
E na função "parseDataBra" altere a primeira linha apenas para Iso:
date = formatIso.parse(dataIso);
return (formatBra.format(date));
Volto a afirmar que esta estrutura de código é excelente, parabéns ao nosso colega acima.
Responder Citar

27/09/2016

Luis Quinhone

Tentei usar essa classe, mas dá erro, usei assim:
ConverteData dt = new ConverteData();
System.out.println(dt.parseBra("2016-09-26 00:00:00"));
System.out.println(dt.parseIso("26/09/2016"));


ERRO
java.text.ParseException: Unparseable date: "2016-09-26 00:00:00"
Parse Date Error
	at java.text.DateFormat.parse(DateFormat.java:366Parse Date Error
)
	at br.com.syrecom.utils.ConverteData.parseBra(ConverteData.java:51)
	at Main.main(Main.java:30)
java.text.ParseException: Unparseable date: "26/09/2016"
	at java.text.DateFormat.parse(DateFormat.java:366)
	at br.com.syrecom.utils.ConverteData.parseIso(ConverteData.java:35)
	at Main.main(Main.java:31)
Responder Citar

27/09/2016

Ricardo Staroski

Você tentou utilizar um parser "yyyy-MM-dd" para parsear "2016-09-26 00:00:00" Se é "yyyy-MM-dd", você só pode passar o "2016-09-26" Se quer realmente passar o "2016-09-26 00:00:00", tem que usar um parser "yyyy-MM-dd HH:mm:ss"
Responder Citar