Сравнение двух объектов Calendar - программирование
Подтвердить что ты не робот

Сравнение двух объектов 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 по полю?

4b9b3361

Ответ 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).