SimpleDataFormat

16 respostas
T

boa a noite a todos, estou estudando a apostila fj-21 e estou com uma duvida, como alterar a data no caso contato.setDataNascimento(Calendar.getInstance());?? se ele nao aceita dd/MM/yyyy

um trecho do meu metodo getLista()
Calendar data = Calendar.getInstance();
					data.setTime(rs.getDate("dataNascimento"));
					
					SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
					String horaFormatada = dateFormat.format(data);
					dateFormat.format(data);
					contato.setDataNascimento(data);

					contatos.add(contato);
eo Main na classe Testa
Contato contato = new Contato();
		

		contato.setNome("Caelum3");
		contato.setEmail("[email removido]");
		contato.setEndereco("Rua Vargas Gomes");
		contato.setDataNascimento(Calendar.getInstance()); // aqui quero passar uma data nova... mas como ??
		contato.setId(new Long(2));
	
		ContatoDAO dao = new ContatoDAO();
		
		dao.Altera(contato);
		
		System.out.println("Gravado!!");

obrigado....

16 Respostas

fabiozanardi

cola o stack trace dos erros também por favor

erico_kl

pq vc nao larga como tipo Date no banco e formata somente na hora de mostrar?

danilo.silva

Não entendi sua dúvida, como assim uma data nova[/url]? Ta pegando de algum lugar os dados? BD por exemplo?
Copie sua classe inteira pra eu entender o funcionamento e poder te ajudar. Abraços

T
public class ContatoDAO {

	private Connection connection;
	
	public ContatoDAO(){
		this.connection = new ConnectionFactory().getConnection();
	}
	
	public void adiciona(Contato contato){
		String sql = "insert into contatos (nome, email, endereco, dataNascimento) values (?,?,?,?)";
		
		try {
			PreparedStatement stmt = connection.prepareStatement(sql);
			

			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			
			stmt.execute();
			stmt.close();
			} catch (SQLException e) {
				throw new RuntimeException(e);
		
		}
	}
		public List<Contato> getLista(){
			try {
				List<Contato> contatos = new ArrayList<Contato>();
				PreparedStatement stmt = this.connection.prepareStatement("select * from contatos");
				ResultSet rs = stmt.executeQuery();
				while(rs.next()){
					Contato contato = new Contato();
					contato.setId(rs.getLong("id"));
					contato.setNome(rs.getString("nome"));
					contato.setEmail(rs.getString("email"));
					contato.setEndereco(rs.getString("endereco"));
					
					Calendar data = Calendar.getInstance();
					data.setTime(rs.getDate("dataNascimento"));
					
					SimpleDateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy");
					String horaFormatada = dateFormat.format(data);              // minha duvida tbm está neste trecho em relação ao dateformat
					dateFormat.format(data);
					contato.setDataNascimento(data);

					contatos.add(contato);
					
				}
				rs.close();
				stmt.close();
				return contatos;
			} catch (SQLException e) {
				throw new RuntimeException(e);
			}
		}
		
		public void Altera(Contato contato){
			String sql = "update contatos set nome=?, email=?, endereco=?, dataNascimento=?, where id=?";
			try{
			PreparedStatement stmt = connection.prepareStatement(sql);
			stmt.setString(1, contato.getNome());
			stmt.setString(2, contato.getEmail());
			stmt.setString(3, contato.getEndereco());
			stmt.setDate(4, new Date(contato.getDataNascimento().getTimeInMillis()));
			stmt.setLong(5, contato.getId());
			stmt.execute();
			stmt.close();
			}catch(SQLException e){
				throw new RuntimeException(e);
			}
		}
public class TestaConexao {

	
	public static void main(String[] args) throws SQLException {
		
		Contato contato = new Contato();
	

		contato.setNome("Caelum3");
		contato.setEmail("[email removido]");
		contato.setEndereco("Rua Vargas Gomes");
		contato.setDataNascimento(Calendar.getInstance()); // minha duvida é como passar uma data diferente da atual, q está pegando aki.
		contato.setId(new Long(2));
	
		ContatoDAO dao = new ContatoDAO();
		
		dao.Altera(contato);
		
		System.out.println("Gravado!!");
snowblacksoul

cadê a classe Contato

ruivo

E Se você fizer assim, não funciona?

public class TestaConexao {

	
	public static void main(String[] args) throws SQLException {
		
		Contato contato = new Contato();
	

		contato.setNome("Caelum3");
		contato.setEmail("[email removido]");
		contato.setEndereco("Rua Vargas Gomes");
               
                Calendar cal = Calendar.getInstance();
		SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
		Date date = null;
		try {
			date = format.parse("21/05/2010");
		} catch (ParseException e) {
			e.printStackTrace();
		}
		
		cal.setTime(date);
		contato.setDataNascimento(date); // <-- trecho modificado
		contato.setId(new Long(2));
	
		ContatoDAO dao = new ContatoDAO();
		
		dao.Altera(contato);
		
		System.out.println("Gravado!!");
caio.ribeiro.pereira

Não seria melhor modificar o atributo private Calendar dataNascimento para private Date dataNascimento na classe Contato?

Pois assim você evitará um grande trecho desnecessário de código durante a formatação dele.

T

Caio é q estou seguindo a rigida os exercicios da lista e la pede Calendar…

Ruivo até q a logica parece ser esta mesmo, mas bem na linha onde vc cita “Trecho modificiado” o objeto contato.setDataNascimento() pede um objeto do tipo Calendar, o date da erro mas o “cal” compila… mas nao funciona… to perdido nesta merda hehe, outro campo q estou confuso é o contato.setId(new Long(2)); // aki eu estou passando o indici de qual emento do banco q vou alterar? pq no meu banco eu tenho id=2| nome=caelum| email= [email removido] e etc…

wbdsjunior
titata:
...
contato.setDataNascimento(Calendar.getInstance()); // minha duvida é como passar uma data diferente da atual, q está pegando aki. 
...

tente:

Calendar data = Calendar.getInstance();
data.set(Calendar.YEAR, 1982);
data.set(Calendar.MONTH, 7); // 0 = Janeiro, 1 = Fevereiro, etc
data.set(Calendar.DAY_OF_MONTH, 30);

contato.setDataNascimento(data);
Andersonrms

titata:
Caio é q estou seguindo a rigida os exercicios da lista e la pede Calendar…

Ruivo até q a logica parece ser esta mesmo, mas bem na linha onde vc cita “Trecho modificiado” o objeto contato.setDataNascimento() pede um objeto do tipo Calendar, o date da erro mas o “cal” compila… mas nao funciona… to perdido nesta merda hehe, outro campo q estou confuso é o contato.setId(new Long(2)); // aki eu estou passando o indici de qual emento do banco q vou alterar? pq no meu banco eu tenho id=2| nome=caelum| email= [email removido] e etc…

Ao invés de passar o Date passe o Calendar:

contato.setDataNascimento(cal);
sidney.tavares

Bom dia a todos,

Aproveitando o topico do colega estou no mesmo exercicio e pelo que pude entender do que ele descreveu eu estou com a mesma duvida. Abaixo esta o meu metodo para pesquisa de contato na classe ContatoDAO:

public List <Contato> getListaContato(){
		try{
			List<Contato> contatos = new ArrayList<Contato>();
			PreparedStatement pst = (PreparedStatement) this.con.prepareStatement("select * from contatos");
			ResultSet rs = pst.executeQuery();
			while(rs.next()){
				Contato contato = new Contato();
				contato.setNome(rs.getString("nome"));
				contato.setEmail(rs.getString("email"));
				contato.setEndereco(rs.getString("endereco"));
				
				
				Calendar date = Calendar.getInstance();
				date.setTime(rs.getDate("dataNascimento"));
				SimpleDateFormat formato = new SimpleDateFormat("yyyy/MM/dd");
				formato.format(date);
				contato.setDataNascimento(date);
				//adiciona o objeto a lista
				contatos.add(contato);
			}
			rs.close();
			pst.close();
			return contatos;
		}catch(SQLException e){
			throw new RuntimeException(e);
		}
	}

E aqui a minha classe que testa esse metodo:

package br.com.caelum.jdbc.teste;

import java.sql.Connection;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;

import br.com.caelum.jdbc.ConnectionFactory;
import br.com.caelum.jdbc.dao.ContatoDAO;
import br.com.caelum.jdbc.modelo.Contato;

public class TestaPesquisa {
	public static void main(String[] args) {
		ContatoDAO dao = new ContatoDAO();
		List<Contato> contatos = dao.getListaContato();
		for(Contato contato : contatos){
			System.out.println("Nome: " + contato.getNome());
			System.out.println("Email: " + contato.getEmail());
			System.out.println("Endereco: " + contato.getEndereco());
			//System.out.println("Nascimento: " + contato.getDataNascimento().getTime()+ "\n");
			System.out.println("Nascimento: " + Calendar.getInstance().getTime());
		}
		
	}

}

O meu problema e nao conseguir exibir na saida a data no formato correto quando pesquiso, para inserir esta funcionando corretamente, do jeito que esta quando executo esta classe recebo a exception abaixo:

Conectando ao banco!
Exception in thread "main" java.lang.IllegalArgumentException: Cannot format given Object as a Date
	at java.text.DateFormat.format(DateFormat.java:281)
	at java.text.Format.format(Format.java:140)
	at br.com.caelum.jdbc.dao.ContatoDAO.getListaContato(ContatoDAO.java:63)
	at br.com.caelum.jdbc.teste.TestaPesquisa.main(TestaPesquisa.java:15)

Como usar a classe SimpleDateFormat para exibir na pesquisa a data informada? Aos colegas que puderem me ajudar eu agradeco.

adriano_si

Cara… o que da solução do ruivo não conseguiu resolver o teu problema ???

Perceba que no stacktrace da sua exceção, o erro ocorre no seu contato DAO.

Eu aconselho a usar o Date diretamente como tipo de dado cara… Esquece o Calendar, Calendar só quando precisar trabalhar com Datas…

Tenta fazer assim:

Date date = rs.getDate("dataNascimento");  
SimpleDateFormat formato = new SimpleDateFormat("yyyy/MM/dd");  
contato.setDataNascimento(formato.format(date));  
contatos.add(contato);

Lembrando que na sua classe Contato, o campo dataNascimento deve ser String e o que é retornado da Select tem que ser uma Data.

Abs []

[EDIT] trabalho com datas que eu falo, é quando você precisar fazer cálculos complexos em cima de datas…

sidney.tavares

Ola adriano_si, primeiramente valeu pela ajuda, estou usando o Calendar porque a apostila sugere pra eu usar Calendar e eu queria entender, mas vou seguir seu conselho sem deixar de pesquisar o funcionamento da forma que a apostila sugere, senao paro o estudo neste topico e nao consigo produzir, valeu mesmo pela ajuda. Abraco.

rafaelshock

fiz um metodo atualiza será q está certo?

public void atualiza (Contato contato){
		String sql = "UPDATE contatos SET( nome=?, email=?, endereco=?, dataNascimento=?) WHERE nome = ?";
		try{
			// prepared statement para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);
		// seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		Calendar data = Calendar.getInstance();
		
		// executa		
		stmt.execute();
		stmt.close();
	}catch (SQLException e){
		throw new RuntimeException(e);
	}
wbdsjunior
rafaelshock:
fiz um metodo atualiza será q está certo?
public void atualiza (Contato contato){
		String sql = "UPDATE contatos SET( nome=?, email=?, endereco=?, dataNascimento=?) WHERE nome = ?";
		try{
			// prepared statement para inserção
		PreparedStatement stmt = connection.prepareStatement(sql);
		// seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		Calendar data = Calendar.getInstance();
		
		// executa		
		stmt.execute();
		stmt.close();
	}catch (SQLException e){
		throw new RuntimeException(e);
	}
sua pergunta não tem a ver com o tópico. por favor abra uma nova thread.

mas respondendo à sua pergunta: não, não está certo.

seu statement (comando sql) tem 5 parametros (os pontos de interrogação) e você só atribui 3.

o correto seria algo como:
...
		PreparedStatement stmt = connection.prepareStatement(sql);
		// seta os valores
		stmt.setString(1, contato.getNome());
		stmt.setString(2, contato.getEmail());
		stmt.setString(3, contato.getEndereco());
		stmt.setString(4, new java.sql.Date(contato.getDataNascimento().getTime());
		stmt.setString(5, contato.getNome());

		// executa		
		stmt.execute();
...
rafaelshock

o blza, e desculpa pelo post em lugar errado!!!

Criado 5 de março de 2012
Ultima resposta 4 de abr. de 2012
Respostas 16
Participantes 12