2010-05-24 73 views
14

Una cosa que quiero saber es cómo calcular qué fecha será en 10 días a partir de hoy.Verificar una fecha es entre dos fechas en Java

Lo segundo es comprobar si una fecha se encuentra entre otras dos fechas. Por ejemplo, supongamos que tengo una aplicación que muestra qué eventos debo hacer en los próximos 10 días (planificador). Ahora, ¿cómo puedo ver si la fecha que asigné a un evento es entre hoy y la fecha de 10 días a partir de hoy?

Respuesta

5

Uso JodaTime clases de reemplazo calendario: http://joda-time.sourceforge.net/

+0

+1 especialmente si están haciendo fecha de llanura (no de fecha y hora), la clase LocalDate de JodaTime le brinda todo lo que necesita. – leonbloy

2

Para añadir diez días:

Date today = new Date(); 
Calendar cal = new GregorianCalendar(); 
cal.setTime(today); 
cal.add(Calendar.DAY_OF_YEAR, 10); 

para comprobar si entre dos fechas:

myDate.after(firstDate) && myDate.before(lastDate); 
20

manipular y fechas que comparan el uso de java.util.Date y java.util.Calendar es bastante un dolor, es por eso que existe JodaTime. Ninguna de las respuestas hasta ahora ha cubierto el tiempo en cuestión. Las comparaciones pueden fallar cuando las fechas tienen un tiempo distinto de cero. Tampoco está claro si desea una comparación inclusive o exclusiva. La mayoría de las respuestas publicadas hasta el momento sugieren exclusiva comparación (a las 24 de mayo es no entre el 20 de mayo y 24 de mayo), mientras que en el sector tendría más sentido para que sea incluido (a las 24 de mayo es entre mayo 20 y 24 de mayo).


Una cosa que me gustaría saber es cómo calcular qué fecha va a ser de 10 días a partir de hoy.

Con la API Java SE 6 estándar, necesita java.util.Calendar para esto.

Calendar plus10days = Calendar.getInstance(); 
plus10days.add(Calendar.DAY_OF_YEAR, 10); 

Con JodaTime que haría así:

DateTime plus10days = new DateTime().plusDays(10); 

Lo segundo es comprobar si la fecha está entre otras dos fechas. Por ejemplo, supongamos que tengo una aplicación que muestra qué eventos debo hacer en los próximos 10 días (planificador). Ahora, ¿cómo puedo ver si la fecha que asigné a un evento es entre hoy y la fecha de 10 días a partir de hoy?

Ahora viene la parte terrible con Calendar. Vamos a preparar en primer lugar:

Calendar now = Calendar.getInstance(); 
Calendar plus10days = Calendar.getInstance(); 
plus10days.add(Calendar.DAY_OF_YEAR, 10); 
Calendar event = Calendar.getInstance(); 
event.set(year, month - 1, day); // Or setTime(date); 

Para comparar de forma fiable utilizando Calendar#before() y Calendar#after(), hay que deshacerse de las veces en primer lugar. Imagine que actualmente es el 24 de mayo de 2010 a las 9:00 a.m. y que la fecha del evento está fijada para el 24 de mayo de 2010 sin tiempo. Cuando desee una comparación inclusiva, le gustaría que sea return true en el mismo día. Es decir. tanto el (event.equals(now) || event.after(now)) o el -shorter pero igualmente-(!event.before(now)) deben devolver verdadero. Pero en realidad ninguno lo hace debido a la presencia del tiempo en now. Es necesario borrar el tiempo en todos los casos calendario primero como sigue:

calendar.clear(Calendar.HOUR); 
calendar.clear(Calendar.HOUR_OF_DAY); 
calendar.clear(Calendar.MINUTE); 
calendar.clear(Calendar.SECOND); 
calendar.clear(Calendar.MILLISECOND); 

Como alternativa, también puede comparar el día/mes/año solamente.

if (event.get(Calendar.YEAR) >= now.get(Calendar.YEAR) 
    && event.get(Calendar.MONTH) >= now.get(Calendar.MONTH) 
    && event.get(Calendar.DAY_OF_MONTH) >= now.get(Calendar.DAY_OF_MONTH) 
{ 
    // event is equal or after today. 
} 

Muy prolijo todo.

Con JodaTime sólo se puede utilizar DateTime#toLocalDate() para obtener la parte de fecha única:

LocalDate now = new DateTime().toLocalDate(); 
LocalDate plus10days = now.plusDays(10); 
LocalDate event = new DateTime(year, month, day, 0, 0, 0, 0).toLocalDate(); 
if (!event.isBefore(now) && !event.isAfter(plus10days)) { 
    // Event is between now and 10 days (inclusive). 
} 

Sí, lo anterior es realmente todo lo que necesita hacer.

13
public static boolean between(Date date, Date dateStart, Date dateEnd) { 
    if (date != null && dateStart != null && dateEnd != null) { 
     if (date.after(dateStart) && date.before(dateEnd)) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    return false; 
} 

EDIT: Otra variante sugerida:

public Boolean checkDate(Date startDate, Date endDate, Date checkDate) { 
    Interval interval = new Interval(new DateTime(startDate), 
            new DateTime(endDate)); 
    return interval.contains(new DateTime(checkDate)); 
} 
+0

esto está usando JodaTime, ¿no es así? – hotzen

+0

y es un ejemplo masivo anti-patrón de comprobación NULL :) – hotzen

0

Tomé la respuesta inicial y modificar un poco. Considero que si las fechas son iguales que ser "dentro" ..

private static boolean between(Date date, Date dateStart, Date dateEnd) { 
    if (date != null && dateStart != null && dateEnd != null) { 
     return (dateEqualOrAfter(date, dateStart) && dateEqualOrBefore(date, dateEnd)); 

    } 
    return false; 
} 

private static boolean dateEqualOrAfter(Date dateInQuestion, Date date2) 
{ 
    if (dateInQuestion.equals(date2)) 
     return true; 

    return (dateInQuestion.after(date2)); 

} 
private static boolean dateEqualOrBefore(Date dateInQuestion, Date date2) 
{ 
    if (dateInQuestion.equals(date2)) 
     return true; 

    return (dateInQuestion.before(date2)); 

} 
0

Para comprobar si la fecha es entre dos fechas, aquí es sencillo programa:

public static void main(String[] args) throws ParseException { 

    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy"); 

    String oeStartDateStr = "04/01/"; 
    String oeEndDateStr = "11/14/"; 

    Calendar cal = Calendar.getInstance(); 
    Integer year = cal.get(Calendar.YEAR); 

    oeStartDateStr = oeStartDateStr.concat(year.toString()); 
    oeEndDateStr = oeEndDateStr.concat(year.toString()); 

    Date startDate = sdf.parse(oeStartDateStr); 
    Date endDate = sdf.parse(oeEndDateStr); 
    Date d = new Date(); 
    String currDt = sdf.format(d); 


    if((d.after(startDate) && (d.before(endDate))) || (currDt.equals(sdf.format(startDate)) ||currDt.equals(sdf.format(endDate)))){ 
     System.out.println("Date is between 1st april to 14th nov..."); 
    } 
    else{ 
     System.out.println("Date is not between 1st april to 14th nov..."); 
    } 
} 
Cuestiones relacionadas