I'm trying to implement without success a Date iterator with Joda time.
I need something that allows me to iterate all the days form startDate to endDate
Do you have any idea on how to do that?
Here's something to get you started. You may want to think about whether you want it to be inclusive or exclusive at the end, etc.
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);
}
}
}
It's a while since I've written an iterator in Java, so I hope it's right. I think it's pretty much okay...
Oh for C# iterator blocks, that's all I can say...
http://code.google.com/p/google-rfc-2445 ?
I know you asked about Joda-Time. Today we should prefer to use java.time, the modern Java date and time API that is basically a further development of Joda-Time. Since Java 9 the iteration of a date range has been built in through a Stream
:
LocalDate startDate = LocalDate.of(2019, Month.AUGUST, 28);
LocalDate endate = LocalDate.of(2019, Month.SEPTEMBER, 3);
startDate.datesUntil(endate).forEach(System.out::println);
Output:
2019-08-28 2019-08-29 2019-08-30 2019-08-31 2019-09-01 2019-09-02
If you wanted the end date to be inclusive, use datesUntil(endate.plusDays(1))
.
And if you literally wanted an Iterator
:
Iterator<LocalDate> ldi = startDate.datesUntil(endate).iterator();
The Joda-Time home page says:
Note that Joda-Time is considered to be a largely “finished” project. No major enhancements are planned. If using Java SE 8, please migrate to
java.time
(JSR-310).
(Joda-Time - Home)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With