Вопрос-ответ

how to get a list of dates between two dates in java

как получить список дат между двумя датами в Java

Мне нужен список дат между датой начала и датой окончания.

Результатом должен быть список всех дат, включая начальную и конечную даты.

Переведено автоматически
Ответ 1

Пакет java.time

Если вы используете Java 8, существует гораздо более чистый подход. Новый пакет java.time в Java 8 включает в себя функции API Joda-Time.

Ваше требование может быть решено с помощью приведенного ниже кода:

String s = "2014-05-01";
String e = "2014-05-10";
LocalDate start = LocalDate.parse(s);
LocalDate end = LocalDate.parse(e);
List<LocalDate> totalDates = new ArrayList<>();
while (!start.isAfter(end)) {
totalDates.add(start);
start = start.plusDays(1);
}
Ответ 2

Еще в 2010 году я предложил использовать для этого Joda-Time.


Обратите внимание, что Joda-Time сейчас находится в режиме обслуживания. Начиная с версии 1.8 (2014), вам следует использовать java.time.


Добавляйте по одному дню за раз до достижения конечной даты:

int days = Days.daysBetween(startDate, endDate).getDays();
List<LocalDate> dates = new ArrayList<LocalDate>(days); // Set initial capacity to `days`.
for (int i=0; i < days; i++) {
LocalDate d = startDate.withFieldAdded(DurationFieldType.days(), i);
dates.add(d);
}

Было бы не слишком сложно реализовать свой собственный итератор и для этого, это было бы еще приятнее.

Ответ 3

Получить количество дней между датами включительно.

public static List<Date> getDaysBetweenDates(Date startdate, Date enddate)
{
List<Date> dates = new ArrayList<Date>();
Calendar calendar = new GregorianCalendar();
calendar.setTime(startdate);

while (calendar.getTime().before(enddate))
{
Date result = calendar.getTime();
dates.add(result);
calendar.add(Calendar.DATE, 1);
}
return dates;
}
Ответ 4

Стримы

Редактировать: Joda-Time теперь устарел, изменил ответ, чтобы вместо него использовать Java 8.

Вот способ Java 8, использующий streams.

List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).collect(Collectors.toList());
java date