Bom dia, tarde, noite, madrugada a todos os leitores do GUJ!! [color=#444444] [/color]
Novamente entro para pedir ajuda de vocês, estou trabalhando com datas no BD, mas tenho um problema que não consegui resolver e por isso estou aqui!
Não consigo “pegar” a minha data do banco de dados no formato que desejo (dd/MM/yyyy). Uso para formatar a data do BD a Classe DateFormat no jeito que eu desejo com o método DateFormat.format(MINHA DATA) - com a condição de que ela se torna uma String e meu Bean tem um atributo data que é do tipo java.util.Date que eu preciso fazer que receba a data que vem assim: yyyy/mm/dd do tipo java.sql.Date e fique desse jeito: dd/MM/yyyy do tipo java.util.Date. Quando eu transformo a classe em data novamente com o método parse() da Classe DateFormat ela volta a ficar por extenso e não consigo faze-la ficar do jeito que quero (dd/MM/yyyy).
Tbm como vocês podem ver coloquei o Locale mas o resultado foi o mesmo.
Desculpem minha ignorância, mas li todos os tópicos do GUJ sobre datas e infelizmente nenhum me ajudou a solucionar o problema, acho que não consegui entender direito pois vi mtos tópicos sobre tal assunto…
[color=blue]OBS:[/color] Não gostaria de mudar o tipo do meu atributo data do meu Bean de java.util.Date para String. Mas se for apenas dessa maneira asim farei!
Alguém tem uma luz??
O código vai abaixo.
Código do meu Bean DATA:
public class Data{
private Integer codigo;
private Date data;
private Locale BRASIL = new Locale("pt", "BR");
public Data(Date data) {
this.data = data;
}
public Data(Integer codigo, Date data) {
DateFormat df = new SimpleDateFormat("dd/MM/yyyy", BRASIL);
String dataString = df.format(data);
this.codigo = codigo;
try {
this.data = df.parse(dataString);
} catch (ParseException ex) {
ex.printStackTrace();
}
}
}
Código da minha classe dataDAO
public TreeSet<Data> getDatas() {
TreeSet<Data> treeLista = new TreeSet<Data>();
try {
String sql = "SELECT * FROM datas";
PreparedStatement pst = con.prepareStatement(sql);
ResultSet rs = pst.executeQuery();
while (rs.next()) {
//Transformar a data que vem do banco de dados como sql.date para util.date
java.util.Date dataUtil = rs.getDate("data");
//Aqui eu chamo o construtor da minha classe DATA com os dados do banco de dados
Data data = new Data(rs.getInt("codigo"), dataUtil);
treeLista.add(data);
}
} catch (SQLException ex) {
ex.printStackTrace();
}
return treeLista;
}
[color=red]OUTRA DÚVIDA![/color]
Pode ser tachada de iniciante mas, qdo se modela um banco de dados e se faz um sistema com base em OO, eu devo ter em meu objeto todos os tipos de dados que estão colocados como tipos de dados do banco de dados? por exemplo: tenho uma coluna data_cadastro que tem como tipo de dados DATE e meu objeto terá tbm um atributo data_cadastro com o mesmo tipo de dados DATE? Isso é por boa prática de programação ou é essencial, achu eu que é essencial mas pergunto as amigos GUJS com quem aprendi java desde o inicio…
Fera… é seguinte eu entendi seu problema… porem não tenho exatamente a solução para o seu problema em especifo já que
no Bean você colocou o atributo do tipo Data do tipo Date…
mas se você deseja resolver isso rapido… sujiro que coloque a variavel Data do tipo String como eu coloquei em um programinha que tenho aqui,
e facilitou tudo pra mim…
na hora de buscar no banco faço assim:
[code]
// no meu caso aqui eu usei duas Query pois fiz duas consultas em tabelas diferentes… mas o que importa pra vc eh o “SimpleDateFormat”…
//tah o codigo todo ai pra vc dah uma analizada… lembrando que no meu bean o campo data está como String
public ArrayList getinformaECliente(String idcliente){
String Query1=“select count(idlocacaosaida) from retiradafilme where idcliente=”+Integer.parseInt(idcliente);
String Query2=“select numlocacoes, ultlocacao, saldo, infadicionais from cadastrocliente where idcliente =” + idcliente;
ArrayList result = new ArrayList();
try{
SimpleDateFormat formato = new SimpleDateFormat(“dd/MMMM/yyyy”);
conexao = oracleConexao.conectarBd();
instrucaoSQL = conexao.createStatement();
resultado = instrucaoSQL.executeQuery(Query1);
if(resultado.next()){
result.add(Integer.toString(resultado.getInt(1)));
}
resultado = instrucaoSQL.executeQuery(Query2);
if(resultado.next()){
result.add(Integer.toString(resultado.getInt(1)));
result.add(formato.format(resultado.getDate(2)));
result.add(Double.toString(resultado.getDouble(3)));
result.add(resultado.getString(4));
}
então galera, entendi como fazer com String, mas o meu medo é depois utilizar um calculo com data e aih, ja viw neh??? vcs fizeram ja algum calculo com data que use a data como String em seu objeto e nao como java.util.Date?? Se ja utilizaram como foi o comportamento?? Trágico ou facil de lidar??
Também gostaria de mexer com o atributo data do tipo java.util.Date para aprender mesmo e por boas práticas, pois não sei se é correto utilizar um campo na base de dados do tipo Date e meu objeto do tipo String…por isso a minha [color=red]outra dúvida[/color]…hehehe
No caso do meu primeiro construtor ele é utlizado apenas para inserir no banco de dados a data que vem como String do meu Formulário na .JSP para a Servlet que pega esta String e a transforma em java.util.Date para colocar no meu objeto DATA e inserir no banco de dados como o código abaixo:
public class GravarDataServlet extends HttpServlet {
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
boolean retorno = false;
DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
try {
//Aqui eu pego o parametro da jsp
Date paramData = df.parse(request.getParameter("data"));
//Instancio a Classe Data que criei
Data data = new Data(paramData);
//Instancio a Classe dataDAO que criei
dataDAO dataDAO = new dataDAO();
//Faço a variavel retorno receber o resultado da operação feita pela classe dataDAO
retorno = dataDAO.gravaData(data);
if (retorno) {
request.getSession().setAttribute("mensagem", "Gravou");
} else {
request.getSession().setAttribute("mensagem", "Não Gravou");
}
} catch (ParseException ex) {
ex.printStackTrace();
} catch (Exception erro) {
out.println("Erro: " + erro);
}
response.sendRedirect("index.jsp");
}
Agora o meu problema é que pela Servlet descrita acima eu pego o parametro como texto e ele vira a data [color=red]por extenso[/color] só que se grava com esse formato (yyyy/MM/dd) e na hora que eu pego a data ela vem por extenso e nao me deixa mudar …que nhaca…hehehe
Por isso vocês falavam e eu não entendia!!! uhahuahuauah…Mal pessoallll!!!
Vejam só, eu pego a data do meu formulário como String, passo ela para util.Date para joga-la dentro do meu objeto e mando o objeto para meu DAO onde eu transformo o meu atributo data - DO MEU OBJETO - que é do tipo util.Date em sql.Date para inserir ela no banco de dados…certo???
então, é só eu fazer o contrário, como vocês me disseram!!! Para que eu preciso transformar ela em util.Date denovo se eu só irei mostrar para o usuário??? Eu posso mostra-la como String e qdo ele fizer alguma alteração eu faço novamente a conversao dela para util.Date para coloca-la em meu objeto e volta ao passo inicial que eu ja comentei ali em cima!!! huahuahuahuahua
O trem bão!!! Muito obrigado pela ajuda que me deram, vocês abriram minha CUCA para pensar…uhauhahuahuauh…é tanto tempo que estou nesse problema q nem pensando estava mais!!! huahuahua
Vlw [color=red]panthovillas[/color] e [color=red]looljunior[/color]!!
Infelizmente o Joda-Time não vai entrar na próxima versão do Java (7), mas é importante aprendê-lo, porque facilita muito seus cálculos com datas, horas etc.