Помогите с логикой календаря Java - PullRequest
2 голосов
/ 18 марта 2011

Я работаю с классом Java Calendar, чтобы сделать следующее:

  1. Установить дату начала
  2. Установить дату окончания
  3. Любая дата в этом диапазонеявляется "действительной" датой

У меня это несколько работает, и немного нет.Пожалуйста, смотрите код ниже:

    nowCalendar.set(Calendar.DATE, nowCalendar.get(Calendar.DATE) + offset);
    int nowDay = nowCalendar.get(Calendar.DATE);

    Calendar futureCalendar = Calendar.getInstance();
    futureCalendar.set(Calendar.DATE, nowDay + days);

    Date now = nowCalendar.getTime();
    Date endTime = futureCalendar.getTime();

    long now_ms = now.getTime();
    long endTime_ms = endTime.getTime();

    for (; now_ms < endTime_ms; now_ms += MILLIS_IN_DAY) {
        valid_days.addElement(new Date(now_ms));
        System.out.println("VALID DAY: " + new Date(now_ms));
    }

По сути, я установил календарь «СЕЙЧАС» и календарь «БУДУЩЕЕ», а затем сравнил два календаря, чтобы найти действительные дни.В моем календаре действительные дни будут закрашены белым, а недействительные дни - серым.Вы заметите две переменные:

    offset = three days after the current selected date
    days = the number of valid days from the current selected date

Это работает ... ЗА ИСКЛЮЧЕНИЕМ, если текущая выбранная дата является последним днем ​​месяца или двумя днями ранее (все три вместе).Я думаю, что это смещение, которое определенно облажается, но логика работает везде.Есть идеи?

Ответы [ 4 ]

2 голосов
/ 18 марта 2011

Не возитесь с миллисекундами. Клонируйте nowCalendar, добавьте к нему 1 день, используя Calendar#add() в цикле, пока он не превысит futureCalendar, и извлеките Date из него, используя Calendar#getTime().

Calendar clone = nowCalendar.clone();

while (!clone.after(futureCalendar)) {
    validDays.add(clone.getTime());
    clone.add(Calendar.DATE, 1);
}

(обратите внимание, что я улучшил validDays до List вместо прежнего Vector)

2 голосов
/ 18 марта 2011

Используйте add вместо set в первой строке, в противном случае месяц не корректируется, если вы находитесь на границе месяца:

nowCalendar.add(Calendar.DATE, offset);
1 голос
/ 18 марта 2011

Я нашел проблему:

Как только я установил futureCalendar как клон nowCalendar (плюс дополнительные дни), он начал работать. Спасибо за все предложения!

1 голос
/ 18 марта 2011
public boolean isInRange(Date d)
{
   Calendar cal = Calendar.getInstance();
   cal.setTime(d);
   return cal.after(startCal) && cal.before(endCal);
}

Здесь startCal - это календарный экземпляр времени начала, а endCal - время окончания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...