Я пытаюсь реализовать без успеха итератор Date со временем Joda.
Мне нужно что-то, что позволяет мне перебирать все дни формы startDate, чтобы endDate
Есть ли у вас какие-либо идеи о том, как это сделать?
Время Java Joda - внедрение итератора диапазона дат
Ответ 1
Здесь что-то, чтобы вы начали. Возможно, вам захочется подумать о том, хотите ли вы, чтобы он был инклюзивным или эксклюзивным в конце и т.д.
import org.joda.time.*;
import java.util.*;
class LocalDateRange implements Iterable<LocalDate>
{
private final LocalDate start;
private final LocalDate end;
public LocalDateRange(LocalDate start,
LocalDate end)
{
this.start = start;
this.end = end;
}
public Iterator<LocalDate> iterator()
{
return new LocalDateRangeIterator(start, end);
}
private static class LocalDateRangeIterator implements Iterator<LocalDate>
{
private LocalDate current;
private final LocalDate end;
private LocalDateRangeIterator(LocalDate start,
LocalDate end)
{
this.current = start;
this.end = end;
}
public boolean hasNext()
{
return current != null;
}
public LocalDate next()
{
if (current == null)
{
throw new NoSuchElementException();
}
LocalDate ret = current;
current = current.plusDays(1);
if (current.compareTo(end) > 0)
{
current = null;
}
return ret;
}
public void remove()
{
throw new UnsupportedOperationException();
}
}
}
class Test
{
public static void main(String args[])
{
LocalDate start = new LocalDate(2009, 7, 20);
LocalDate end = new LocalDate(2009, 8, 3);
for (LocalDate date : new LocalDateRange(start, end))
{
System.out.println(date);
}
}
}
Это время, так как я написал итератор на Java, поэтому надеюсь, что это правильно. Я думаю, это все в порядке...
Ох для блоков итератора С#, что все, что я могу сказать...
Ответ 2
Ответ 3
Я знаю, что вы спросили о Joda-Time. Сегодня мы должны предпочесть использовать java.time, современный Java-интерфейс даты и времени, который в основном является дальнейшим развитием Joda-Time. Начиная с Java 9 итерация диапазона дат была встроена через Stream
:
LocalDate startDate = LocalDate.of(2019, Month.AUGUST, 28);
LocalDate endate = LocalDate.of(2019, Month.SEPTEMBER, 3);
startDate.datesUntil(endate).forEach(System.out::println);
Выход:
2019-08-28 2019-08-29 2019-08-30 2019-08-31 2019-09-01 2019-09-02
Если вы хотите, чтобы конечная дата была включительной, используйте datesUntil(endate.plusDays(1))
.
И если вы буквально хотели Iterator
:
Iterator<LocalDate> ldi = startDate.datesUntil(endate).iterator();
На домашней странице Joda-Time написано:
Обратите внимание, что Joda-Time считается в основном "законченным" проектом. Никаких серьезных улучшений не планируется. Если вы используете Java SE 8, пожалуйста, перенесите в
java.time
(JSR-310).