java - Comparando dos objetos de calendario
theory (5)
Quiero comparar dos objetos de calendario para ver si ambos contienen la misma fecha. No me importa ningún valor por debajo de los días.
Lo he implementado y no puedo pensar en ningún caso donde debería fallar:
private static boolean areEqualDays(Calendar c1, Calendar c2) {
SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy");
return (sdf.format(c1.getTime()).equals(sdf.format(c2.getTime())));
}
¿Es correcto este enfoque o debería comparar c1 y c2 campo por campo?
Lo he implementado y no puedo pensar en ningún caso donde debería fallar
Fallará si los dos calendarios están en diferentes zonas horarias, podrían representar el mismo milisegundo exacto , pero ese instante podría caer en días diferentes según la zona horaria.
También podría decirse que fallaría si los dos calendarios representan diferentes sistemas de calendario, incluso si representan el mismo "día", si los dos calendarios representarían ese día de manera diferente, podría argumentar que debería fallar.
Personalmente, le recomendaría encarecidamente que utilice Joda Time, que tiene el tipo LocalDate
para representar solo una fecha, que eliminaría el problema de la zona horaria, pero no el problema del sistema de calendario. Si siempre puedes asumir que estás usando el mismo sistema de calendario, entonces está bien.
(Además, realizar operaciones de cadena solo para propósitos de comparación es feo: simplemente verificaría calendar.get(Calendar.YEAR)
etc. directamente).
La clase de calendario tiene un método compareTo. ¿Por qué no llamas eso directamente?
Prueba compareTo
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);
Devoluciones :
el valor 0 si el tiempo representado por el argumento es igual al tiempo representado por este Calendario; un valor menor que 0 si el tiempo de este calendario es anterior al tiempo representado por el argumento; y un valor mayor que 0 si el tiempo de este calendario es posterior al tiempo representado por el argumento.
EDITAR
import org.apache.commons.lang3.time.DateUtils;
Puede usar DateUtils.isSameDay
para verificar si es el mismo día.
boolean isSameDay = DateUtils.isSameDay(c1, c2);
28 de marzo 2002 13:45 y 28 de marzo 2002 06:01 volvería cierto. 28 de marzo de 2002 a las 13:45 y 12 de marzo de 2002 a las 13:45 devolverá falso.
Para comparar dos fechas con respecto a un campo específico, primero configure todos los campos debajo de ese valor mínimo (que es 0 o 1 según el campo) usando Calendar.set (int field, int value) y luego compare. Para comparar los días entre cal1 y cal2, establecerá MINUTE, SECOND y MILLISECOND en ambos objetos en 0 antes de llamar a cal1.compare (cal2).
Puede usar algo como DateUtils
public boolean isSameDay(Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null)
return false;
return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA)
&& cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}