Справка Java по сравнению объектов календаря - PullRequest
0 голосов
/ 26 января 2011

Я разработал виджет «Календарь» на Java (особенно для разработки BlackBerry). Пользователь может просматривать все дни в текущем месяце, а также перемещаться вперед / назад в месяцах / годах.

Когда я рисую свой календарь (в формате таблицы), я хочу изменить цвет любых дней, которые на X дней раньше текущей даты. В настоящее время я могу проверить это ТОЛЬКО, если отображаемый на экране календарь совпадает с текущим месяцем:

    if (calendarMonth == currentMonth) {
        for (int i = 1; i <= (NUM_DAYS_IN_MONTH); i++) {
            if (i > currentDay + Constants.CALENDAR_DAYS_IN_ADVANCE) {
                System.out.println("VALID: " + i);
            }
        }
    }

Но у меня возникают проблемы при кодировании решения, когда показанный календарь отличается от текущего месяца. Например, сегодня 26 января, поэтому в январском календаре все январские дни отображаются серым цветом. Когда пользователь меняет месяц на февраль, следующие дни должны быть серыми:

Constants.CALENDAR_DAYS_IN_ADVANCE = 14;
1/26/2011 - 2/9/2011

Любые дни после этого диапазона будут черного цвета. В общем, я хочу написать функцию, которая будет принимать два объекта java.util.Calendar (показывается активный календарь и календарь на текущую дату), а функция будет возвращать массив дат в диапазоне CURRENT DATE - CALENDAR_DAYS_IN_ADVANCE.

Мне также нужно помнить следующее:

1) Я не могу сравнивать даты с функциями java.util.Calendar.add () или java.util.Calendar.subtract (), так как java для BlackBerry ограничен

2) Это должно работать и в разные годы, например, декабрь 2010 - январь 2011

Кто-нибудь может помочь с логикой?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 26 января 2011

Допустим, у вас есть 2 Calendar экземпляров: nowCal указывает на 00:00:00 вашей даты начала, а maxOffsetCal указывает на 23:59:59 вашей даты окончания. Следующий код напечатает нужные даты:

public class Test {
    private final static long MILLIS_IN_DAY = 86400 * 1000;

    public static void main(String[] args) {
        Calendar nowCal = new GregorianCalendar();
        setTime(nowCal, 29, 1, 2011, 0, 0, 0);
        Calendar maxOffsetCal = new GregorianCalendar();
        setTime(maxOffsetCal, 2, 2, 2011, 23, 59, 59);
        long now = nowCal.getTimeInMillis(), endTime = maxOffsetCal.getTimeInMillis();
        for (; now < endTime; now += MILLIS_IN_DAY ) {
            System.out.println(new Date(now));
        }
    }

    private static void setTime(Calendar c, int dayOfMonth, int monthOfYear, int year,
                                    int hourOfDay, int minute, int second) {
        c.set(Calendar.DAY_OF_MONTH, dayOfMonth);
        c.set(Calendar.MONTH, monthOfYear - 1);
        c.set(Calendar.YEAR, year);
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, second);
        c.set(Calendar.MILLISECOND, 0);
    }
}
0 голосов
/ 26 января 2011

if (calendarMonth == currentMonth)

неверно.Никогда не используйте == для сравнения объектов.Оператор == сравнивает ссылки, поэтому это верно, только если вы имеете дело с одним и тем же объектом, но не с разными равными объектами.Вы должны использовать метод equals() вместо.

...