entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Funcion en Java para manejar fecha actual más 7 días

Estoy teniendo problemas con el manejo de fecha en java.

Lo primero que hago es obtener en un Servlet la fecha que me selecciona el usuario desde un input de tipo date.

Después quiero comparar que la fecha que me ha seleccionado desde el input el usuario no sea mayor que 7 días desde el día actual en que estamos.

Existe alguna función para calcular eso?

El problema suele venir al cambiar de mes, muchas gracias!

2 Respuestas

3votos

Podrías hacer algo como esto:

private static final long MILISEGUNDOS_SIETE_DIAS = 7 * 24 * 60 * 60 * 1000;
private static final SimpleDateFormat formateador = new SimpleDateFormat("dd-MM-yyyy");
public boolean isMayorSieteDias(String fecha) {
    Date dateFechaUsuario = formateador.parse(fecha);
    Calendar calendarUsuario = Calendar.getInstance();
    calendarUsuario.setTime(dateFechaUsuario);
    Calendar calendarHoraActual = Calendar.getInstance();
    if (calendarHoraActual.getTimeInMillis() - calendarUsuario.getTimeInMillis() > milisegundosSieteDias) {
         return true;
    }
        return false;
}

El único detalle que me gustaría comentar es que habría que tener en cuenta la zona horaria del usuario, el cual también podría ser un parámetro de entrada y sólo habría que especificarle al objeto Calendar que estamos usando esa zona horaria.

Espero sirva.

Un saludo.

0voto

danielreales7 comentado

Muchas gracias! Lo he entendido perfectamente, un saludo.

0voto

danielreales7 comentado

Bueno me ha surgido otra duda, realice este código:

public long diferenciaDias(int Y1, int M1, int D1, int Y2, int M2, int D2){
    Date fecha1, fecha2;

    long diferencia = 0;

    fecha1 = new Date(Y1,M1,D1);

    fecha2 = new Date(Y2,M2,D2);

    diferencia = fecha2.getTime()-fecha1.getTime();
    diferencia = diferencia/(3600000*24);
    return diferencia;
}

Y si selecciono un dia menos del dia actual me devuelve -1, perfecto. Ahora si selecciono uno más +1, perfecto. El problema es cuando cambio de mes, por ejemplo estamos a 30 y quiero dentro de los 7 días siguientes, es decir hasta el 6 de febrero podría y me tendría que devolver +7, pues en este caso me devuelve 5 y no entiendo el porqué.

0voto

carlossevi comentado

El constructor de la clase Date con 3 parámetros de entrada es:

public Date(int year, int month, int date)

Con:

  • Year: año posterior a 1900
  • Month: valor del mes, entre 0 y 11
  • Date: día del mes, entre 1 y 31

Tu problema seguramente es que no estás teniendo en cuenta que los meses empiezan a contar a partir del cero.

0voto

danielreales7 comentado

Lo que hago más arriba es esto:

Calendar c1 = Calendar.getInstance();
    String dia2 = Integer.toString(c1.get(Calendar.DATE));
    String mes2 = Integer.toString(c1.get(Calendar.MONTH));
    String anio2 = Integer.toString(c1.get(Calendar.YEAR));

    int comparaDia = Integer.parseInt(dia2);
    int comparaMes = Integer.parseInt(mes2)+1;
    int comparaAnio = Integer.parseInt(anio2);

comparaMes le pongo +1 porque efectivamente empieza en 0, y pensé que ese sería el error, pero si le quito ese +1 en vez de devolverme 5 me devuelve 30 y tampoco debería de ser.
(Me devuelve 30 si calculo eso desde el día que es hoy, hasta el 1 de febrero) Y en vez de devolverme 2 dias me devuelve 30 y si le pongo +1 en comparaMes me devuelve -1

0voto

carlossevi comentado

En primer lugar me parece mucho más claro calcular la diferencia con el método que te apuntaba Humberto más arriba mediante el método getTimeInMillis() y la creación de las fechas con el parse de SimpleDateFormat.

Una vez dejado esto claro y viendo que prefieres aplicar el constructor de la clase Date (que por cierto creo que está obsoleto) deberías aclararnos desde dónde informas Y1, M1 y D1.

Entiendo que Y2, M2 y D2 los tomas del cálculo anterior que se corresponde con la fecha actual, pero ¿y los otros? ¿cómo se los pasas a la función?

Me temo que en lugar de poner un +1 a la salida del get(Calendar.MONTH)) lo que tienes que hacer es un -1 al mes de M1. La variable mes2 ya la tienes con el valor correcto entre 0 y 11 por lo que no tienes que tocarla, el problema lo tendrás en M1 si es que el valor lo tomas de una entrada del usuario.

Ya por último, comentarte que no entiendo por qué conviertes la salida de los gets a String para después volverlos a convertir a Integer. ¿Tiene sentido por algo que no vemos en el fragmento de código que has puesto?

0voto

danielreales7 comentado

Mira, ese trozo era de haber probado varios métodos parecidos, pero en todos me pasa el mismo error.
Te explico mejor, recibo en el Servlet el value del input de tipo date:

int anio = Integer.parseInt(request.getParameter("calendarioMini").split("-")[0]);
int mes = Integer.parseInt(request.getParameter("calendarioMini").split("-")[1]);
int dia = Integer.parseInt(request.getParameter("calendarioMini").split("-")[2]);

Una vez recogido obtengo de la misma forma la fecha de hoy:

Calendar c1 = Calendar.getInstance();
    String dia2 = Integer.toString(c1.get(Calendar.DATE));
    String mes2 = Integer.toString(c1.get(Calendar.MONTH));
    String anio2 = Integer.toString(c1.get(Calendar.YEAR));

    int comparaDia = Integer.parseInt(dia2);
    int comparaMes = Integer.parseInt(mes2)+1;
    int comparaAnio = Integer.parseInt(anio2);

Ese +1 como te dije es porque recibía de enero el valor 0 por eso lo incremente para que fuera del 1 al 12.
Y con este método:

public long diferenciaDias(int Y1, int M1, int D1, int Y2, int M2, int D2){
    Calendar date = Calendar.getInstance();
    Calendar date2 = Calendar.getInstance();
    //Establecemos las fechas
    date.set(Y1, M1, D1);
    date2.set(Y2, M2, D2);
    // conseguir la representacion de la fecha en milisegundos
    long milis1 = date.getTimeInMillis();
    long milis2 = date2.getTimeInMillis();
    // calcular la diferencia en milisengundos
    long diff = milis2 - milis1;
    // calcular la diferencia en segundos
    long diffSeconds = diff / 1000;
    // calcular la diferencia en minutos
    long diffMinutes = diff / (60 * 1000);
    // calcular la diferencia en horas
    long diffHours = diff / (60 * 60 * 1000);
    // calcular la diferencia en dias
    long diffDays = diff / (24 * 60 * 60 * 1000);

    return diffDays;
}

Calculo la diferencia de días. Aquí tengo varias formas más que no las uso, como pasarla a milisegundos, minutos,etc, pero las tengo por si un futuro...
Y con esto llamo a este método:

long diferenciaTotal=diferenciaDias(comparaAnio,comparaMes,comparaDia,anio,mes,dia);

Lo que pasa que todo lo hace bien excepto al pasar de de un mes a otro.
Espero que lo hayas entendido todo mejor, muchas gracias!

0voto

humberto_garcia_caba comentado

El código está bien, el problema es que no puedes sumar +1 a los meses para que estén en el rango [1,12] ya que, aunque para ti tendría sentido, para la clase Calendar no lo tendría. Imagínate que el usuario seleccionase el mes de Enero (si seguimos la especificación de Calendar debería ser el 0, si seguimos tu especificación sería 1), y quieres calcular los días que van desde el 20-1-2014 hasta el 1-2-2014. La respuesta debería ser 11 días. Sin embargo, si sumas +1 al mes, la clase Calendar interpretaría que quieres calcular la diferencia entre el 20-2-2014 y el 1-3-2014, siendo la respuesta diferente ya que Febrero tiene menos días.

No sé si esto soluciona tu duda, espero que sí.

Un saludo.

0voto

carlossevi comentado

Como comenta Humberto, veo que debes cambiar:

nt mes = Integer.parseInt(request.getParameter("calendarioMini").split("-")[1]);

por

nt mes = Integer.parseInt(request.getParameter("calendarioMini").split("-")[1]) - 1;

Motivo: El calendario te devolverá una fecha con formato yyyy-mm-dd y el mes estará con valores entre 1 y 12. Necesitas pasarlo a valores entre 0 y 11 para el constructor de Date() así que le tienes que restar uno al mes.

También tienes que cambiar:

int comparaMes = Integer.parseInt(mes2)+1;

por

int comparaMes = Integer.parseInt(mes2);

Motivo: La función get(Calendar.MONTH)) ya devuelve el mes con valores entre 0 y 11, de tal manera que no necesitas ninguna conversión adicional.

Espero haber servido de ayuda.

3votos

egoitz_gonzalez Puntos10050

Hola Daniel.

En el siguiente ejemplo se calculan los días que han pasado desde una fecha asignada hasta el día de hoy:

final long MILLSECS_PER_DAY = 24 * 60 * 60 * 1000; //Milisegundos al día 
java.util.Date hoy = new Date(); //Fecha de hoy 

int año = 2009; int mes = 10; int dia = 22; //Fecha anterior 
Calendar calendar = new GregorianCalendar(año, mes-1, dia); 
java.sql.Date fecha = new java.sql.Date(calendar.getTimeInMillis());

long diferencia = ( hoy.getTime() - fecha.getTime() )/MILLSECS_PER_DAY; 
System.out.println(diferencia);

Luego comprueba que la diferencia sea igual o menor a 7 y ya esta.

Adjunto la fuente: http://felinfo.blogspot.com.es/2009/09/calcular-la-diferencia-en-dias-entre.html

0voto

danielreales7 comentado

Muchas gracias por comentar, ya lo he entendido, un saludo!

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta