Java Joda Time - 实现Date范围迭代器

时间:2009-07-23 22:42:37

标签: java date iterator jodatime

我正试图在没有成功的情况下使用Joda时间实现Date迭代器 我需要一些东西,允许我从startDate到endDate的所有日子迭代 你知道怎么做吗?

3 个答案:

答案 0 :(得分:28)

这是让你入门的东西。您可能想要考虑是否希望它最终具有包容性或排他性等等。

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编写了一个迭代器已经有一段时间了,所以我希望是正确的。我认为这很好......

哦,对于C#迭代器块,我只能说......

答案 1 :(得分:1)

答案 2 :(得分:1)

我知道您问过乔达·时代(Joda-Time)。今天,我们应该更喜欢使用java.time,这是现代Java日期和时间API,它基本上是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)。

Joda-Time - Home