Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Joda Time - Implement a Date range iterator

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?

like image 872
mickthompson Avatar asked Jul 23 '09 22:07

mickthompson


3 Answers

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...

like image 88
Jon Skeet Avatar answered Nov 11 '22 13:11

Jon Skeet


http://code.google.com/p/google-rfc-2445 ?

like image 37
Den Orlov Avatar answered Nov 11 '22 15:11

Den Orlov


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)

like image 20
Ole V.V. Avatar answered Nov 11 '22 15:11

Ole V.V.