Мне нужен цикл, который перебирает интервал дат - PullRequest
7 голосов
/ 15 января 2010

У меня есть дата начала и дата окончания. Мне нужно перебирать каждый день между этими двумя датами.

Какой лучший способ сделать это?

Я могу предложить только что-то вроде:

Date currentDate = new Date (startDate.getTime ());
while (true) {
   if (currentDate.getTime () >= endDate.getTime ())
      break;
   doSmth ();
   currentDate = new Date (currentDate.getTime () + MILLIS_PER_DAY);
}

Ответы [ 4 ]

13 голосов
/ 15 января 2010

готов к запуску; -)

public static void main(String[] args) throws ParseException {
    GregorianCalendar gcal = new GregorianCalendar();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
    Date start = sdf.parse("2010.01.01");
    Date end = sdf.parse("2010.01.14");
    gcal.setTime(start);
    while (gcal.getTime().before(end)) {
        gcal.add(Calendar.DAY_OF_YEAR, 1);
        System.out.println( gcal.getTime().toString());
    }
}
6 голосов
/ 16 января 2010

То же самое для тех, кто говорит об использовании объекта Calendar.

Вы можете столкнуться с неожиданными неприятностями, если попытаетесь использовать объект Date и добавить к нему 24 часа.

Вот загадка для вас: какой самый длинный месяц в году? Вы можете подумать, что нет ответа на этот вопрос. У семи месяцев по 31 день, поэтому они все одинаковой длины, верно? Ну, в Соединенных Штатах это было бы почти правильно, но в Европе это было бы неправильно! В Европе октябрь самый длинный месяц. У него 31 день и 1 час, потому что европейцы переводят свои часы на 1 час на летнее время в октябре, делая один день в октябре 25 часов. (У американцев сейчас начинается летнее время в ноябре, у которого 30 дней, поэтому ноябрь все еще короче октября или декабря. Таким образом, эта загадка не так забавна для американцев.)

Однажды я столкнулся с проблемой, выполнив точно то, что вы пытаетесь сделать: я использовал объект Date и добавил к нему 24 часа в цикле. Это работало до тех пор, пока я не перешел границы летнего времени. Но когда я это сделал, внезапно я пропустил один день или дважды ударил один и тот же день, потому что полночь 8 марта 2009 года + 24 часа = 1:00 утра 10 марта. Отбросьте время, как я делал, и 9 марта загадочным образом пропустили , Точно так же полночь 1 ноября 2009 года + 24 часа = 23:00 вечера 1 ноября, и мы дважды ударили 1 ноября.

3 голосов
/ 15 января 2010

Используйте объект календаря, если вы хотите манипулировать датами.

    Calendar c = Calendar.getInstance();
    // ... set the calendar time ...
    Date endDate = new Date();
    // ... set the endDate value ...

    while (c.getTime().before(endDate) {
       // do something
       c.add(Calendar.DAY_OF_WEEK, 1);
    }

Или используйте Joda Time

2 голосов
/ 15 января 2010

Я настоятельно рекомендую использовать Время Joda :

Java Joda Time - Реализация итератора диапазона дат

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