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.
+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