Tenho postado várias dúvidas sobre como tratar datas na camada de apresentação e na de persistência…
Com a ajuda de vocês e principalmente do fabiocsi tenho conseguido resolver vários problemas.
Bom… desta vez a minha dúvida é a seguinte:
Tentei criar uma classe com dois métodos, um para receber um Date e retornar um string, e outro para receber um String e retornar um Date.
Basicamente, a intenção era:
Com o primeiro método: utilizar na tela para receber um Date do banco, converter em String num formato escolhido para poder mostrar num JTextField.
E com o segundo: utilizar na camada de persistência para receber um String, converter em Date num formato escolhido para poder gravar no banco.
Segue meu código e o erro que esta dando na compilação:
package com.atm.util;
import java.sql.Date;
import java.text.SimpleDateFormat;
/**
*
* @author r100320
*/
public class ConverterData {
public static String dateToString(Date data, String formato){
SimpleDateFormat sdf = new SimpleDateFormat(formato);
return sdf.format(data);
}
public static Date stringToDate(String data, String formato) throws Exception {
SimpleDateFormat sdf = new SimpleDateFormat(formato);
try {
return (Date) sdf.parse(data);
} catch (ParseException ex) {
throw new Exception("A Data é inválida ou nao encontra-se no formato DD/MM/YYYY");
}
}
}
E agora o erro que recebo na compilação:
init:
deps-jar:
Compiling 1 source file to D:\ProjetoATM\atm\build\classes
D:\ProjetoATM\atm\src\com\atm\util\ConverterData.java:28: incompatible types
found : java.util.Date
required: java.sql.Date
return sdf.parse(data);
1 error
FALHA NA EXECUÇÃO (tempo total: 4 segundos)
O erro é na linha:
return sdf.parse(data);
Se eu faço um cast para (Date) funciona… mas eu não entendi porque !
return (Date) sdf.parse(data);
Se alguém puder me ajudar, fico muitíssimo grato !
A hierarquia de classes de Date é a seguinte:
java.lang.Object
extended by java.util.Date
extended by java.sql.Date
O método parse de SimpleDateFormat retorna um java.util.Date, logo a conflito de tipos pois você pode falar que todo java.sql.Date é um java.util.Date e não o contrário. Quando você faz o casting você está assumindo o risco de quanto a conversão de tipos em tempo de compilação, mas dará erro em tempo de execução (ClassCastException). O mais prudente seria você colocar a seguinte linha:
return new Date(sdf.parse(data).getTime());
onde você estaria criando um java.sql.Date a partir de um java.util.Date
Então… ainda estou com problemas para pegar o valor digitado no JTextField e transformar em Date ou Timestamp para usar no prepareStatement para atualizar no banco…
Você pode me ajudar ?
A classe que criei para tentar fazer isso é essa:
public class ConverterData {
public static String dateToString(Timestamp data, String formato){
SimpleDateFormat sdf = new SimpleDateFormat(formato);
return sdf.format(data);
}
public static Timestamp stringToDate(String data, String formato) {
SimpleDateFormat sdf = new SimpleDateFormat(formato);
try {
return (Timestamp) sdf.parse(data);
} catch (ParseException ex) {
ex.printStackTrace();
return null;
}
}
}
Bom, pelo menos esta funcionando, ou seja, pego uma data do banco no formato “yyyy-DD-mm” e mostro num JTextField da tela como “dd/MM/yyyy” e pego um JTextField da tela, com “dd/MM/yyyy” e gravo no banco no formato “yyyy-DD-mm”.
Tambem esta funcionando para um campo com data e hora, ou seja, no banco esta “yyyy-DD-MM hh:mm:ss” e na tela quero que apareça “dd/MM/yyyy hh:mm:ss”.
Segue o código da classe que faz as conversões e a chamada onde eu a utilizo.
public class ConverterData {
public static String dateToString(Timestamp data, String formato){
SimpleDateFormat sdf = new SimpleDateFormat(formato);
return sdf.format(data);
}
public static Timestamp stringToDate(String data, String formato) {
JOptionPane.showMessageDialog(null, data + "-"+formato);
SimpleDateFormat sdf = new SimpleDateFormat(formato);
try {
return new Timestamp(sdf.parse(data).getTime());
} catch (ParseException ex) {
ex.printStackTrace();
return null;
}
}
}