Сравнение двух объектов Calendar
Я хочу сравнить два объекта Calendar, чтобы увидеть, содержат ли они оба одинаковые даты. Меня не волнует какая-либо ценность ниже дней.
Я реализовал это, и я не могу думать ни о каком случае, когда он должен потерпеть неудачу:
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())));
}
Правильно ли этот подход или я должен сравнивать поле c1 и c2 по полю?
Ответы
Ответ 1
Я реализовал это, и я не могу думать ни о каком случае, когда он должен потерпеть неудачу
Это не сработает, если два календаря находятся в разных часовых поясах - они могут представлять собой то же самое миллисекунду, но этот момент может падать в разные дни по часовому поясу.
Это также возможно провалится, если два календаря представляют разные системы календаря, даже если они представляют один и тот же "день", если два календаря будут представлять этот день по-другому, вы можете утверждать, что он должен потерпеть неудачу.
Лично я настоятельно рекомендую вам использовать Joda Time, который имеет тип LocalDate
для представления только даты - это избавит вас от проблемы часового пояса, но не проблема системы календаря. Если вы всегда можете предположить, что используете одну и ту же систему календаря, тогда все в порядке.
(Кроме того, выполнение строковых операций только для целей сравнения является уродливым - я просто просто проверю calendar.get(Calendar.YEAR)
и т.д.)
Ответ 2
Попробуйте compareTo
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
c1.compareTo(c2);
Возвращает
значение 0, если время, представленное аргументом, равно времени, представленному этим Календарем; значение меньше 0, если время этого Календаря до времени, представленного аргументом; и значение больше 0, если время этого Календаря после времени, представленного аргументом.
ИЗМЕНИТЬ
import org.apache.commons.lang3.time.DateUtils;
Вы можете использовать DateUtils.isSameDay
, чтобы проверить, в тот же день.
boolean isSameDay = DateUtils.isSameDay(c1, c2);
28 марта 2002 13:45 и 28 марта 2002 года 06:01 вернется. 28 марта 2002 года 13:45 и 12 марта 2002 года 13:45 вернутся с ошибкой.
Ответ 3
Вы можете использовать что-то вроде 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));
}
Вы также можете проверить, совпадает ли дата и время:
public boolean isSameDateTime(Calendar cal1, Calendar cal2) {
// compare if is the same ERA, YEAR, DAY, HOUR, MINUTE and SECOND
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)
&& cal1.get(Calendar.HOUR_OF_DAY) == cal2.get(Calendar.HOUR_OF_DAY)
&& cal1.get(Calendar.MINUTE) == cal2.get(Calendar.MINUTE)
&& cal1.get(Calendar.SECOND) == cal2.get(Calendar.SECOND));
}
Ответ 4
Календарный класс имеет метод compareTo. Почему вы не называете это напрямую?
Ответ 5
Чтобы сравнить две даты по отношению к определенному полю, сначала установите все поля ниже этого значения с наименьшим значением (которое равно 0 или 1 в зависимости от поля) с помощью Calendar.set(int field, int value), а затем сравните,
Чтобы сравнить разные дни между cal1 и cal2, вы установите MINUTE, SECOND и MILLISECOND на оба объекта на 0 перед вызовом cal1.compare(cal2).