Я безуспешно пытаюсь внедрить итератор даты со временем Joda.
Мне нужно что-то, что позволит мне перебирать все дни от startDate до endDate
У вас есть идеи, как это сделать?
Java Joda Time — реализовать итератор диапазона дат
Ответы (3)
Вот кое-что, чтобы вы начали. Вы можете подумать о том, хотите ли вы, чтобы он был инклюзивным или эксклюзивным в конце и т. д.
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, так что надеюсь он правильный. Я думаю, что это вполне нормально...
О блоках итераторов С#, это все, что я могу сказать...
Iterable: может быть, более сложную...
- person Stephan; 22.05.2014
Я знаю, что вы спрашивали о Joda-Time. Сегодня мы должны предпочесть использовать java.time, современный API даты и времени 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).