【发布时间】:2010-11-13 13:53:13
【问题描述】:
我正在尝试使用 Joda 时间实现 Date 迭代器,但没有成功。
我需要一些可以让我从 startDate 到 endDate
你知道怎么做吗?
【问题讨论】:
-
如果你想要几天,你想看看 LocalDate 类(设置一个作为你的开始日期)并为接下来的每一天做一个加号。这将避免即时固有的时区问题。
标签: java date iterator jodatime
我正在尝试使用 Joda 时间实现 Date 迭代器,但没有成功。
我需要一些可以让我从 startDate 到 endDate
你知道怎么做吗?
【问题讨论】:
标签: java date iterator jodatime
这里有一些东西可以帮助您入门。您可能需要考虑是否希望它最终具有包容性或排他性等。
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# 迭代器块,我只能这么说......
【讨论】:
Iterable 实现:可能更复杂...
我知道你问过 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)。
【讨论】: