[Resolvido]Formatando Data

7 respostas
S

Bom dia a todos, estou com o seguinte problema:

O usuário insere a data no seguinte formato: dd/MM/yyyy e preciso gravar essa data no banco de dados no entanto ele só aceita o formato yyyy-MM-dd. Existe alguma classe que possa realizar a conversão?

7 Respostas

drsmachado

Pesquise por SimpleDateFormat e DateFormat.

Rodrigo_Sasaki

Você grava a data enviando uma String? ou um Date?

S

O SimpleDateFormat retorna sempre desse jeito:

Thu Dec 03 00:00:00 AMT 11

Vou dar uma olhada no DateFormat.

String.

Rodrigo_Sasaki

Se for uma conversão entre Strings você tem opções, pode usar o DateFormat, pra criar um Date e depois pegar de volta em outro formato, ou pode trabalhar com as Strings mesmo. Ex:String dataInicial = "20/06/2012"; String[] values = dataInicial.split("/"); String dataFinal = values[2]+"-"+values[1]+"-"+values[0]; Ou até uma brincadeira com Expressões Regulares, feita em um artigo do próprio GUJString dataInicial = "20/06/2012"; Pattern pattern = Pattern.compile("(\\d{2})/(\\d{2})/(\\d{4})"); Matcher matcher = pattern.matcher(dataInicial); String dataFinal = ""; if(matcher.find()){ dataFinal = matcher.replaceAll("$3-$2-$1"); }

S

Consegui resolver o problema com a sua sugestão, usando SimpleDateFormat. O problema é que eu fiz assim:

String pattern = "yyyy/MM/dd"; SimpleDateFormat format = new SimpleDateFormat(pattern); System.out.println(format.format(new Date(dataInicial)));

O metodo construtor Date(String s) está marcado como deprecated. Existe alguma forma de se obter o mesmo resultado (ou melhor) utilizando um metodo que não esteja deprecated?

digaoneves:
Se for uma conversão entre Strings você tem opções, pode usar o DateFormat, pra criar um Date e depois pegar de volta em outro formato, ou pode trabalhar com as Strings mesmo. Ex:String dataInicial = "20/06/2012"; String[] values = dataInicial.split("/"); String dataFinal = values[2]+"-"+values[1]+"-"+values[0]; Ou até uma brincadeira com Expressões Regulares, feita em um artigo do próprio GUJString dataInicial = "20/06/2012"; Pattern pattern = Pattern.compile("(\\d{2})/(\\d{2})/(\\d{4})"); Matcher matcher = pattern.matcher(dataInicial); String dataFinal = ""; if(matcher.find()){ dataFinal = matcher.replaceAll("$3-$2-$1"); }

Nunca havia pensado em fazer dessa forma. Eu já conhecia o split mas nunca pensei em usa-lo dessa forma.

Obrigado aos 2 pela ajuda.

drsmachado

Sem_Nome:
Consegui resolver o problema com a sua sugestão, usando SimpleDateFormat. O problema é que eu fiz assim:

String pattern = "yyyy/MM/dd"; SimpleDateFormat format = new SimpleDateFormat(pattern); System.out.println(format.format(new Date(dataInicial)));

O metodo construtor Date(String s) está marcado como deprecated. Existe alguma forma de se obter o mesmo resultado (ou melhor) utilizando um metodo que não esteja deprecated?

digaoneves:
Se for uma conversão entre Strings você tem opções, pode usar o DateFormat, pra criar um Date e depois pegar de volta em outro formato, ou pode trabalhar com as Strings mesmo. Ex:String dataInicial = "20/06/2012"; String[] values = dataInicial.split("/"); String dataFinal = values[2]+"-"+values[1]+"-"+values[0]; Ou até uma brincadeira com Expressões Regulares, feita em um artigo do próprio GUJString dataInicial = "20/06/2012"; Pattern pattern = Pattern.compile("(\\d{2})/(\\d{2})/(\\d{4})"); Matcher matcher = pattern.matcher(dataInicial); String dataFinal = ""; if(matcher.find()){ dataFinal = matcher.replaceAll("$3-$2-$1"); }

Nunca havia pensado em fazer dessa forma. Eu já conhecia o split mas nunca pensei em usa-lo dessa forma.

Obrigado aos 2 pela ajuda.


Por que você está tratando data como String quando envia para o banco de dados?
Data é data e pronto, não String.

public java.util.Date converteStringParaData(String recebida, String formato){
  SimpleDateFormat sdf = new SimpleDateFormat(formato);//normalmente formato = "dd/MM/yyyy"
  java.util.Date dt = null;
  try{
    dt = sdf.parse(recebida);
  }catch(ParseException pe){}
  return dt;
}

E quando for salvar, usando PreparedStatement

PreparedStatement stm = con.prepareStatement(query);
stm.setDate(1, new java.sql.Date(converteStringParaData(str, "dd/MM/yyyy").getTime()));
stm.execute();

Tratar datas como Strings, em bancos de dados é uma solução ruim, infantil. Embora as conversões pareçam mais complexas, elas garantem uma qualidade maior ao que você desenvolve.

S

Concordo que uma pessima solução, realmente preciso me livrar desse vicio.

Criado 20 de junho de 2012
Ultima resposta 20 de jun. de 2012
Respostas 7
Participantes 3