Ajuda para inserir um campo date

8 respostas
rafa120

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>

8 Respostas

Gleidson_Henrique

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

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;
    }
    }

Veja se isso te serve amigo.

Abraços

B

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.

rafa120

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

B

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"
rafa120

Cadastrou, mas sem a hora.

Não teria que mudae no DAO tb?

ErickRAR

O campo no tabela tem que ser timestamp

rafa120

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?

B

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.

Criado 18 de outubro de 2012
Ultima resposta 18 de out. de 2012
Respostas 8
Participantes 4