Java Joda Time - Implement a Date range iterator

前端 未结 3 1129
无人共我
无人共我 2020-12-05 20:19

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 h

相关标签:
3条回答
  • 2020-12-05 20:57

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

    0 讨论(0)
  • 2020-12-05 21:09

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

    0 讨论(0)
  • 2020-12-05 21:17

    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)

    0 讨论(0)
提交回复
热议问题