【问题标题】:Java Joda Time - Implement a Date range iteratorJava Joda Time - 实现日期范围迭代器
【发布时间】:2010-11-13 13:53:13
【问题描述】:

我正在尝试使用 Joda 时间实现 Date 迭代器,但没有成功。
我需要一些可以让我从 startDate 到 endDate
你知道怎么做吗?

【问题讨论】:

  • 如果你想要几天,你想看看 LocalDate 类(设置一个作为你的开始日期)并为接下来的每一天做一个加号。这将避免即时固有的时区问题。

标签: java date iterator jodatime


【解决方案1】:

这里有一些东西可以帮助您入门。您可能需要考虑是否希望它最终具有包容性或排他性等。

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# 迭代器块,我只能这么说......

【讨论】:

  • 谢谢,这让我的生活至少轻松了 900%。
  • 我在谷歌上搜索 Joda 是否有代表“日期范围”的东西......显然没有,因为您建议编写自己的 LocalDateRange。
  • @Jonik Joda 提供了 Interval 接口及其各种实现。但是我找不到Iterable 实现:可能更复杂...
【解决方案2】:
【解决方案3】:

我知道你问过 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 2012-08-15
    相关资源
    最近更新 更多