Генерация диапазона дат - нужны предложения по улучшению кода

Я генерирую все даты между двумя датами.

public List<Date> generateRangeDates(Date firstDate, Date lastDate) {
    List<Date> allDates = new ArrayList<Date>();
    Calendar calendar = new GregorianCalendar();

    calendar.setTime(firstDate);

    while (calendar.getTime().before(lastDate)) {
        Date resultado = calendar.getTime();
        allDates .add(resultado);
        calendar.add(Calendar.DATE, 1);
    }

    Date lastDate1 = allDates .get(dates.size()-1);
    Calendar cal = new GregorianCalendar();
    cal.setTime(lastDate1);
    cal.add(Calendar.DATE, 1);
    allDates .add(cal.getTime());

    for(Date date1 : dates) {
        System.out.println("All Dates : "+ date1);
    }

    return dates;
}

Вышеупомянутый метод генерирует все даты, начиная с первой даты до последней даты. Я знаю, что у него есть большой недостаток. например, я мог бы использовать joda-time вместо java.util.Calendar. есть также двусмысленность по поводу перехода на летнее время. также он не упомянул TIMEZONE. Также используется GregorianCalendar, который полностью игнорирует текущую локаль. - на данный момент - Я НЕ ХОЧУ ИСПОЛЬЗОВАТЬ JODA API.

Требуется помощь, чтобы обновить указанную выше функцию, которая работает во всех ЧАСОВЫХ ПОЯСАХ. Я много гуглил по этому поводу, но также сильно запутался.

также вопрос (может показаться немного глупым): почему люди настаивают на использовании JODA API? нет ли двусмысленности?

Примечание. Эти строки генерируют последнюю дату и добавляются в список allDates.

Date lastDate1 = allDates .get(dates.size()-1);
Calendar cal = new GregorianCalendar();
cal.setTime(lastDate1);
cal.add(Calendar.DATE, 1);
allDates .add(cal.getTime());

person Namita    schedule 22.01.2012    source источник
comment
Будет ли это лучше на codereview.se?   -  person Kevin D    schedule 22.01.2012
comment
Потому что Joda Time — это более чистый API, чем признанная катастрофа, которая является стандартной датой JDK.   -  person Dave Newton    schedule 22.01.2012
comment
для получения дополнительной информации о JODA посетите joda-time.sourceforge.net   -  person Fahim Parkar    schedule 22.01.2012
comment
JodaTime имеет класс LocalDate, который реализует концепцию даты (это то, что вам нужно, и что Java API не предоставляет вам)   -  person leonbloy    schedule 24.01.2012


Ответы (1)


Есть ли причина не использовать long для раз? Если вам нужно использовать даты, вы можете сделать это.

Дата не зависит от часового пояса.

 public List<Date> generateRangeDates(Date firstDate, Date lastDate) {
      List<Date> dates = new ArrayList<Date>();
      for(long t = firstDate.getTime(); t <= lastDate.getTime(); t += 24 * 60 * 60 * 1000)
          dates.add(new Date(t));
      return dates;
 }

Вы не можете создать полный список, не зависящий от часового пояса, поскольку в Java нет такой структуры данных.

Причина, по которой другие могли предложить использовать JODA, заключается в том, что у него есть правильные объекты Date (без времени), поскольку он не зависит от часового пояса.

person Peter Lawrey    schedule 22.01.2012
comment
Спасибо, Питер, но твоя программа не сгенерирует последнюю дату. Нужно ли мне писать отдельно, чтобы рассчитать последнюю дату и добавить ее в список, как я сделал в своем коде. - person Namita; 22.01.2012
comment
Просто JODA гораздо лучше организована и разработана, чем API календаря Java. - person Louis Wasserman; 22.01.2012