Ajuda para inserir um campo date

Pessoal, gostaria de mais uma ajuda de vcs, por favor
Está dando erro no campo do tipo date

java.lang.NullPointerException
	at java.text.SimpleDateFormat.parse(Unknown Source)
	at java.text.DateFormat.parse(Unknown Source)
	at br.com.changes.model.command.CadastrarChanges.execute(CadastrarChanges.java:37)

A classe DAO

private void setPreparedStatement(Changes changes, PreparedStatement ps)
			throws SQLException {

		ps.setDate(3, new Date(changes.getData().getTime()));

	}

classe de cadastro

public class CadastrarChanges implements InterfaceCommand {
	
	private InterfaceChangesDAO changesDAO;

	public CadastrarChanges(InterfaceChangesDAO changesDAO) {
		super();
		this.changesDAO = changesDAO;
	}

	@Override
	public String execute(HttpServletRequest request,
			HttpServletResponse response) throws ParseException {
		
		String data = request.getParameter("data");

		try {
			Changes changes = new Changes();
			
			changes.setCodigo(request.getParameter("codigo"));
			changes.setCliente(request.getParameter("cliente"));
			
			Date datac = new SimpleDateFormat("dd/MM/yyyy").parse(data); //O erro é nesta linha!
			changes.setData(datac);
			
			changes.setDescricao(request.getParameter("descricao"));
			changes.setStatus(request.getParameter("status"));
			changes.setObservacao(request.getParameter("observacao"));	
						
		} catch (SQLException e) {
			request.setAttribute("mensagem", "Ocorreu problema com a gravação! " +e.getMessage());
			e.printStackTrace();
		}catch (NumberFormatException e) {
			request.setAttribute("mensagem", "Valor inválido: "+e.getMessage());			
			e.printStackTrace();
		}
		request.setAttribute("titulo", "cadastro - changes");
		return "ChangesController?cmd=editarChanges";
	}

}

o input da minha pagina de cadastro jsp

<td><input id="data" name="data" style="height: 20px" maxlength="10" value="${changes.data}"></input></td>

Eu criei uma classe auxiliar para trabalhar com as datas e tenho os seguintes métodos nele

[code]public String convertDateToString(Date date){
SimpleDateFormat formatBra;
formatBra = new SimpleDateFormat(“dd/MM/yyyy”);
try {
java.util.Date newData = formatBra.parse(date.toString());
return formatBra.format(newData);
} catch (ParseException Ex) {
return “Erro na conversão da data”;
}
}

public Date convertStringToDate(String date){
    DateFormat fmt = new SimpleDateFormat("dd/MM/yyyy");
    Date data = null;
    try {
        if(!date.equalsIgnoreCase("  /  /    ")){
            data = new Date(fmt.parse(date).getTime());
        }
    } catch (ParseException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return data;
}
}[/code]

Veja se isso te serve amigo.

Abraços

Verifica se esta vindo o valor para a string, coloca um break-point na linha 14 …

String data = request.getParameter("data");

… entre no try, e veja se data, esta com o valor do request.getParameter(“data”). Caso esteja correto o valor de data, tente realizar o format da seguinte forma:

String data = request.getParameter("data");
Date datac = new Date();

/*
* Repare que eu faço (new).parse(), ao invés de new.parse(), por que :
* (new format()).parse() vai executar o new, e depois, dara um parse nesse new
* new format.parse vai tentar dar um new em um format.parse(),  mas o .parse() é um date.
*/
if((data != null) && (!"".equals(data)) // evita parse em data null ou vazia
datac = (new java.text.SimpleDateFormat("dd/MM/yyyy")).parse(data);

:!:
Apenas um adendo, o que acontece por exemplo, se o usuario tentar digitar algo como “99/99/9999” no seu campo data ? Ele retorna vazio ? Ele não retorna nada ? E se o usuario digitar algo como “bacon” no input, o que acontece ? Tenta criar uma máscara ou um js para fazer o format, e evitar errinhos no input.

Deu certo, brufelipe

Antes já mostrava a exception quando clicava pra abrir o formulário, agora abre e cadastra a data :wink:

Mas como eu posso cadastrar além data, cadastrar uma hora tb? nunca fiz nesse tipo e nem tenho noção
eu teria que criar mais um campo na tabela só pra receber as horas ou é melhor fazer no campo data que já tem?

valeu

Voce pode colocar sim no mesmo campo se quiser, e na hora do format passar “dd/MM/yyyy HH:mm” pra data digitada. O problema vai ser mascarar o input.
Pra manipulação de data, eu recomendaria o uso de um calendar, eles são mais fáceis de manipular, e mais amigáveis. De uma olhada na documentação.
O que voce pode fazer, é colocar um input para dd/MM/yyyy e um para HH:mm, e fazer o seguinte:

include java.util.Calendar;

String data = request.getParameter("data"); // "dd/MM/yyyy"
String hora = request.getParameter("hora"); // "HH:mm"

Date datac = new java.util.Date();

datac = (new java.text.SimpleDateFormat("dd/MM/yyyy HH:mm")).parse(data + " " + hora); // Concateno data + espaço + hora para ficar "dd/MM/yyyy HH:mm"; sem concatenar, ficaria "dd/MM/yyyyHH:mm"

Cadastrou, mas sem a hora.

Não teria que mudae no DAO tb?

O campo no tabela tem que ser timestamp

Hm, é… agora no banco aceita hora, mas ainda não recebe a hora que eu digito

tenho q importar java.util.Calendar em algum lugar?

Quanto a inserção de data e hora no banco, voce precisar ver na sua query, como voce esta executando, e tomar alguns cuidados:

No banco, o mês vem primeiro que o dia (MM/dd/yyyy HH:mm:ss), mas voce pode inserir a data como uma string. Por exemplo:

Você tem a tabela (fictícia) log, e nela voce tem o campo log_data, do tipo datetime.

O usuario digita um valor de data e um de hora, e voce os coloca no date. Então, na hora de gravar, voce recupera esses valores! O campo datetime, aceita data e hora no formato String, como por exemplo:
INSERT INTO log (log_data) VALUES (“10/18/2012 15:00:00”);
Então, o que fazer ?
Na hora de inserir, na query voce pode colocar o value do insert, pegando direto do date:


Date datac = new java.util.Date(); // Suponha que ja inicie com o valor "18/10/2012 15:00:00"

String bancoValueData = (new java.text.SimpleDateFormat("MM/dd/yyyy HH:mm")).format(datac);

// Depois, voce faz a query:
// "INSERT INTO Tabela (Campo) VALUES (" + bancoValueData + ")"

:!: Porém, tente usar bindings, para evitar sqlInjection.