Java日期迭代器工厂,具有指定如何计算间隔的规则

Java日期迭代器工厂,具有指定如何计算间隔的规则,java,date,iterator,rules,Java,Date,Iterator,Rules,我正在寻找一个Java类,我可以在其中指定一组日期规则,例如“每3个星期天”和“每2个月第一次出现一个星期一”。我希望能够从中获得类似于无限迭代器的内容(.next()将返回与规则集匹配的下一个日期) 我想我可以自己制作——但日历是一件麻烦事,而且感觉类似的东西应该已经存在了。我讨厌成为一个重新发明垃圾轮子的人 有人知道这样的事吗?我一直在关注JODA,它似乎为它奠定了基础,但似乎没有提供我想要的全部功能。我认为没有任何现成的JODA time迭代器或Java Calendar API,但是有了

我正在寻找一个Java类,我可以在其中指定一组日期规则,例如“每3个星期天”和“每2个月第一次出现一个星期一”。我希望能够从中获得类似于无限迭代器的内容(.next()将返回与规则集匹配的下一个日期)

我想我可以自己制作——但日历是一件麻烦事,而且感觉类似的东西应该已经存在了。我讨厌成为一个重新发明垃圾轮子的人


有人知道这样的事吗?我一直在关注JODA,它似乎为它奠定了基础,但似乎没有提供我想要的全部功能。

我认为没有任何现成的JODA time迭代器或Java Calendar API,但是有了JODA,它太容易了,你应该直接使用它。例如,在暂停几个月后重新熟悉joda之后,我在大约10分钟内完成了以下操作:

public class InstantIterator implements Iterator<Instant>,
                                        Iterable<Instant> {

    private Instant current;
    private final Instant original;
    private Duration skip;
    private List<Instant> skipThese;

    public InstantIterator(Instant startFrom, Duration skip) {
        this.current = original = startFrom;
        this.skip = skip;
        skipThese = new Vector<Instant>();
    }

    public boolean hasNext() {
        return true;
    }

    public Instant next() {
        Instant currentNext = current.toInstant();
        current = current.plus(skip);
        while (skipThese.contains(currentNext)) {
            currentNext = current.toInstant();
            current = current.plus(skip);
        }
        return currentNext;
    }

    public void remove() {
        skipThese.add(current.toInstant());
    }

    public Iterator<Instant> iterator() {
        return this;
    }

    public void rewind() {
        current = original.toInstant();
    }

    public void resetRemoved() {
        skipThese.clear();
    }

    public void resetIterator() {
        rewind();
        resetRemoved();
    }
}
public类InstantIterator实现迭代器,
宜人的{
私有瞬时电流;
私人最终即时原件;
私用时长跳过;
私人名单;
公共InstantIterator(从即时开始,持续时间跳过){
this.current=original=startFrom;
this.skip=跳过;
skipThese=新向量();
}
公共布尔hasNext(){
返回true;
}
公共即时下一步(){
Instant currentNext=current.toInstant();
当前=当前加(跳过);
while(skipThese.contains(currentNext)){
currentNext=current.toInstant();
当前=当前加(跳过);
}
返回当前下一步;
}
公共空间删除(){
skipThese.add(current.toInstant());
}
公共迭代器迭代器(){
归还这个;
}
公共无效倒带(){
当前=原始.toInstant();
}
已删除公共无效重置(){
skipThese.clear();
}
公共无效重置迭代器(){
倒带();
重置已删除();
}
}
Joda Time非常棒:-)

我的公司有,但它是为.NET设计的,所以它可能对你没有任何好处。

你可以看看哪个是为工作安排而设计的。

tl;博士 简单,使用java.time

第三个星期四:

LocalDate.now().with(                                             // Get today's date, then adjust.
    TemporalAdjusters.dayOfWeekInMonth( 3 , DayOfWeek.THURSDAY )  // Define adjuster to move to third Thursday of same month.
)                                                                 // Instantiates another `LocalDate` object (java.time uses immutable objects).
java.time 与最早版本的Java捆绑在一起的旧日期时间类现在已经过时,被Java.time类取代

该类表示一个仅限日期的值,不包含一天中的时间和时区

LocalDate ld = LocalDate.of( 2018 , Month.FEBRUARY , 17 ) ;
对于任何
LocalDate
,您都可以调整为同一个月内一周中某一天的顺序出现(例如:第三个星期四、第二个星期二等)。使用枚举指定星期几

要进行调整,请使用类中的实现

将该调整器应用于任何
LocalDate
,生成另一个
LocalDate
对象

LocalDate thirdThursday = ld.with( thirdThursdayAdjuster ) ;
类似于无限迭代器的内容(.next()将返回下一个匹配的日期

只需从一个
LocalDate
移动到另一个。您可以调用
LocalDate::addMonths
。或者如果一次处理一个月,则使用
YearMonth

TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​( 3 , DayOfWeek.THURSDAY ) ;  // Third-Thursday. 
List<LocalDate> dozenThirdThursdays = new ArrayList<>( 12 ) ;
YearMonth start = YearMonth.of( 2018 , Month.MARCH ) ;
for( int i = 1 ; i <= 12 ; i ++ ) {
    YearMonth ym = start.plusMonths( i ) ;
    LocalDate firstOfMonth = ym.atDay( 1 ) ;
    LocalDate thirdThursday = firstOfMonth.with( thirdThursdayAdjuster ) ;
    dozenThirdThursdays.add( thirdThursday ) ;
}
TemporalAdjuster thirdThursdayAdjuster=TemporalAdjusters.dayOfWeekInMonth​(3,星期四);//第三个星期四。
List dozentherdthursdays=新数组列表(12);
年月开始=年月日(2018年3月);

对于(int i=1;i)虽然一点也不重要,但我只想说,这是我制作的第二个支持remove()的迭代器,通常我发现它太麻烦而无法支持它。
TemporalAdjuster thirdThursdayAdjuster = TemporalAdjusters.dayOfWeekInMonth​( 3 , DayOfWeek.THURSDAY ) ;  // Third-Thursday. 
List<LocalDate> dozenThirdThursdays = new ArrayList<>( 12 ) ;
YearMonth start = YearMonth.of( 2018 , Month.MARCH ) ;
for( int i = 1 ; i <= 12 ; i ++ ) {
    YearMonth ym = start.plusMonths( i ) ;
    LocalDate firstOfMonth = ym.atDay( 1 ) ;
    LocalDate thirdThursday = firstOfMonth.with( thirdThursdayAdjuster ) ;
    dozenThirdThursdays.add( thirdThursday ) ;
}