0

Estoy teniendo duros problemas con un fragmento de código bastante sencillo pero no funciona y me gustaría conocer porque.

Estoy recuperando de una base de datos a través de un servidor una lista de objetos, de esta lista de objetos obtengo una fecha y la comparo con una fecha seleccionada con un componente calendario.

for (int i = 0; i < listaTarea.size(); i++) {
                System.out.println("Fecha tarea: " +listaTarea.get(i).getFecha_realizar());
                System.out.println("Fecha comparar: "+date1);
                if(listaTarea.get(i).getFecha_realizar() == date1) {
                    cont_tareas++;
                }
            }

Como podéis ver en el log, obtengo las 2 fechas y las voy comparando, como se puede apreciar las 2 fechas contienen exactamente el mismo formato y coinciden, con lo cual debería permitir acceder al condicional y realizar x acción

Fecha tarea: 2019-05-09
Fecha comparar: 1900-01-28
Fecha tarea: 1900-01-10
Fecha comparar: 1900-01-28
Fecha tarea: 1900-01-28

El ultimo registro, el fecha comparar y el fecha tarea coinciden, con lo cual debería permitir al codigo acceder a la sentencia IF y aumentar ese contador.

Esto me lleva pasando ya en 2 proyectos similares, que es lo que falla?

Las fechas que comparo son Date de la libreria java.sql.Date

  • Aparte de la cuestión de *==* vs *equals()*, comprueba que tipo de objetos usas; en concreto *java.util.Date* (y su subclase *java.sql.Date*) representan un tiempo **en milisegundos**, así que si comparas "05/05/2019 00:00:00.000" con "05/05/2019 00:00:00.001" te dará que no son iguales. Considera usar *LocalDate* o incluso la representación del día como *String* (revisa *SimpleDateFormat*). ¡Ah! Y cuidado con las zonas horarias (trabajar con fechas y horas siempre es muy "divertido"). – SJuan76 May 05 '19 at 11:06
  • La fecha que selecciona el usuario "fecha tarea" me devuelve un java.util.Date, con tal de comparar 2 dates del mismo tipo (java.sql.Date) he convertido el util.Date en sql.Date creando una variable y obteniendo su valor java.sql.Date date1 = new java.sql.Date(date.getTime()); – M. Scholz May 05 '19 at 11:08
  • Como *java.sql.Date* hereda (*extends*) de *java.util.Date*, cualquier *java.sql.Date* también es un *java.util.Date*. – SJuan76 May 05 '19 at 11:09
  • Con tal de librarme el problema de los milisegundos puedo convertir un java.sql.Date en un LocalDate o en "algo" que tan solo tenga en cuenta la fecha? (yyyy-mm-dd)? – M. Scholz May 05 '19 at 11:12

1 Answers1

0

Prueba con esta lógica a ver si te funciona:

for (int i = 0; i < listaTarea.size(); i++) {
                System.out.println("Fecha tarea:" +listaTarea.get(i).getFecha_realizar());
                System.out.println("Fecha comparar: "+date1);
                if(!listaTarea.get(i).getFecha_realizar().before(data1) && !listaTarea.get(i).getFecha_realizar().after(data1)) {
                    cont_tareas++;
                }
            }

Lo que hago es preguntarle si la fecha no es antes o después, si ambas son falsas es porque la fecha es igual.

Si esto no funciona, para hacer lo del formato puedes hacer lo siguiente:

  1. Tomar la cadena que te devuelve la salida que nos mostraste, hacer un split() como esto:

String fecha = "1900-02-28"; String[] fechas = fecha.split("-"); // Date(aaaa,mm,dd,hh,mm,ss) Date d = new Date(Integer.parseInt(fechas[0]), Integer.parseInt(fechas[1]), Integer.parseInt(fechas[2]), 0,0,0);

Y hacer la comparación que te dije con el método after() y before() de la clase Date.

V0LT3RR4
  • 1,218
  • 3
  • 20
  • 47