Formatando Date (java.util.Date)

Oi novamente pessoal

Estou com um problema para gerar uma Data, então vou direto para o código que é mais legal.


/*
 * 
 * TIPO ABSTRATO HETEROGENEO ORIENTADO A OBJETO
 * Neste caso o objeto é Aluno
 * 
 * Exercicio:
 * 
 * Criar objeto Aluno com as seguintes caracte-
 * risticas:
 * 
 * - Matricula;
 * - Nome;
 * - Data de Nascimento;
 * - Sexo.
 * 
 * Depois, criar metodos para:
 * 
 * - Cadastrar;
 * - Listar;
 * - Pesquisar por Nome/Matricula/Data de Nascimento/Sexo;
 * - Ordenar por Nome/Matricula/Data de Nascimento/Sexo;
 * 
 * No caso de Cadastrar, na data de nascimento pode-se usar
 * a função Date(java.util.Date) para transformar o String
 * em um Date, em uma data.
 * 
 * 
 * 
 */

import java.awt.TextArea;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.JOptionPane;

public class Abstrato_2 {

	static final int MAX = 4;
	static int opMenu1 = 0, opMenu2 = 0, contador = 0;
	static String saida = "";

	static class Aluno {

		int matricula;
		String nome;
		Date dataNascimento;
		char sexo;

	}

	public static void main(String arg[]) {

		Aluno aluno[] = new Aluno[MAX];
		TextArea conteudo = new TextArea();
		conteudo.setEditable(false);

		String menu1 = "1 - Cadastrar\n" + "2 - Listar\n" + "3 - Pesquisar\n"
				+ "4 - Ordenar\n" + "5 - Sair";
		String menu2 = "1 - Matricula\n" + "2 - Nome\n"
				+ "3 - Data de Nascimento\n" + "5 - Sexo";

		while (opMenu1 != 5) {

			opMenu1 = Integer.parseInt(JOptionPane.showInputDialog(menu1));

			switch (opMenu1) {

			case 1:

				cadastrar(aluno);
				break;

			case 2:
				conteudo.setText(listar(aluno));
				JOptionPane.showMessageDialog(null, conteudo);

			}
		}
	}

	private static String listar(Aluno[] aluno) {

		for (int i = 0; i < MAX; i++) {
			if (aluno[i] != null) {
				saida += "Matricula: " + aluno[i].matricula + "\nNome: "
						+ aluno[i].nome + "\nData de Nascimento: "
						+ aluno[i].dataNascimento + "\nSexo: " + aluno[i].sexo
						+ "\n\n";
			}

		}
		return saida;
	}

	private static void cadastrar(Aluno[] aluno) {

		if ( contador < MAX ) {
			
			aluno[contador] = new Aluno();
			
			aluno[contador].matricula = Integer.parseInt(JOptionPane.showInputDialog("Matricula:"));
			aluno[contador].nome = JOptionPane.showInputDialog("Nome:");
			String nascData = JOptionPane.showInputDialog("Data de Nascimento: dd/mm/aaaa");     
			aluno[contador].dataNascimento = gerarData(nascData);
			aluno[contador].sexo = JOptionPane.showInputDialog("Sexo: M/F").toUpperCase().charAt(0);
		}

	}

	private static Date gerarData(String nascData) {
		
		SimpleDateFormat data = new SimpleDateFormat("dd/MM/yyyy");
		
		try {
			Date casdastroData = data.parse(nascData);
			return casdastroData;
		} catch ( Exception ex) {
			JOptionPane.showMessageDialog(null, "Data invalida");
			return new Date();
		}
		
	}
}

Meu problema esta no metodo gerarData, nesta parte, linha 116 e 117:

			Date casdastroData = data.parse(nascData);
			return casdastroData;

eu coloquei a data: 10/10/1960 e esta retornando “Sun Jan 10 00:00:00 BRT 1960”.

Fiz dessa forma para não cadastrar datas invalidas mas queria que a saida fosse 10/10/1960. Já tentei uns comandos diferentes, só não estou conseguindo resolver.

Alguem pode me ajudar?

Vlw

Blackbeard, logo abaixo está um exemplo que acabei de rodar com DATE e CALENDAR, ambos casos funcionou, com as seguintes saídas:

Mon Oct 10 00:00:00 BRT 1960
Mon Oct 10 00:00:00 BRT 1960


	public static void main(String[] args) {
		// Determina uma data qualquer
		String data = "10/10/1960";

		// Exemplo utilizando callendar, split na string que fornece a data
		Calendar calendar = new GregorianCalendar(Integer.parseInt(data
				.split("/")[2]), Integer.parseInt(data.split("/")[1]) - 1,
				Integer.parseInt(data.split("/")[0]));
		System.out.println(calendar.getTime());

		// Exemplo utilizando date e simpledateformat e o método parse
		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		Date d = null;
		try {
			d = sdf.parse(data);
		} catch (ParseException e) {
			System.err.println("Erro ao transformar a data");
		}
		System.out.println(d);
	}

Espero ter ajudado.

Obrigado, mas não ajudou muito porque a minha saida esta sendo igual, neste formato “Sun Jan 10 00:00:00 BRT 1960” e queria a saida assim: “10/01/1960”.

de uma olhada nos links

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

http://javafree.uol.com.br/javabb/viewtopic.jbb?t=8910

André Fonseca e outros,

Ta, tem uma coisa que eu não entendi, o SimpleDateFormat verifica se a data é valida ou não? tipo, ele acusa se uma data invalida se colocar como data 31/02/1950?

Se não ai não me adianta na esses links, ja procurei bastante coisa na internet e não encontrei. Nesse meu metodo eu queria que validasse a data e ainda que coloque no formato “dd/MM/yyyy”, validar ele já faz, só não esta colocando nesse formato.

Se alguem puder rodar esse programinha que fiz e ver o que esta acontecendo e ainda me ajudar vou ficar bem grato mesmo.

Cara agora entendi o que você quer, você quer validar sua data e mostrá-la no formato “10/01/1960” em vez de “Sun Jan 10 00:00:00 BRT 1960” .

Para isto basta mudar algumas coisas em seu método listar, colocando um simpledateformat e utilizar um FORMAT na dataNascimento, veja abaixo:

private static String listar(Aluno[] aluno) {
		SimpleDateFormat spf = new SimpleDateFormat("dd/MM/yyyy");
		
		
		for (int i = 0; i < MAX; i++) {
			if (aluno[i] != null) {
				saida += "Matricula: " + aluno[i].matricula + "\nNome: "
						+ aluno[i].nome + "\nData de Nascimento: "
						+spf.format(aluno[i].dataNascimento) + "\nSexo: " + aluno[i].sexo
						+ "\n\n";
			}

		}
		return saida;
	}

Outra coisa, sei que você já está validando a data, mas tenho um método que realiza a validação em regex, vou deixar aqui caso te ajude.

	/**
	 * Valida o formato da data
	 * 
	 * @param data
	 *            data informada
	 * @return true se estiver no formato correto ou false se estiver no formato incorreto
	 */
	public static boolean isValid(String data) {
		// Define a expressão regex
		StringBuilder sb = new StringBuilder();
		sb.append("^(((0[1-9]|[12]\d|3[01])\/(0[13578]");
		sb.append("|1[02])\/((1[6-9]|[2-9]\d)\d{2}))|");
		sb.append("((0[1-9]|[12]\d|30)\/(0[13456789]|");
		sb.append("1[012])\/((1[6-9]|[2-9]\d)\d{2}))|((0[1-9]|");
		sb.append("1\d|2[0-8])\/02\/((1[6-9]|[2-9]\d)\d{2}))|");
		sb.append("(29\/02\/((1[6-9]|[2-9]\d)(0[48]|");
		sb.append("[2468][048]|[13579][26])|((16|[2468][048]|[3579][26])00))))$");
		String regex = sb.toString();

		// Define a string de pattern para realizar validação
		Pattern pattern = Pattern.compile(regex);
		// Passa a string para ser validada com base na sequencia definida
		Matcher matcher = pattern.matcher(data);

		// Retorna true ou false de acordo com resultado
		return matcher.find();
	}

Valeu juniormaverick, eu pensava que isso se resolveria no metodo gerarData e não no listar.

Brigadão.