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