Joda时间:如何在某个日期间隔获取工作日的日期?

我有两个LocalDates代表一些时间间隔。 现在我必须得到所有星期五的LocalDates,这个间隔包含。 最简单的方法吗?

解决方案:懒洋洋地一步一周。

import org.joda.time.LocalDate; import java.util.Iterator; public class DayOfWeekIterator implements Iterator{ private final LocalDate end; private LocalDate nextDate; public DayOfWeekIterator(LocalDate start, LocalDate end, int dayOfWeekToIterate){ this.end = end; nextDate = start.withDayOfWeek(dayOfWeekToIterate); if (start.getDayOfWeek() > dayOfWeekToIterate) { nextDate = nextDate.plusWeeks(1); } } public boolean hasNext() { return !nextDate.isAfter(end); } public LocalDate next() { LocalDate result = nextDate; nextDate = nextDate.plusWeeks(1); return result; } public void remove() { throw new UnsupportedOperationException(); } } 

测试

 import org.joda.time.DateTimeConstants; import org.joda.time.LocalDate; public class DayOfWeekIteratorTest { public static void main(String[] args) { LocalDate startDate = new LocalDate(2010, 12, 1);//1st Dec 2010 LocalDate endDate = new LocalDate(2010, 12, 31);//31st Dec 2010 DayOfWeekIterator it = new DayOfWeekIterator(startDate, endDate, DateTimeConstants.FRIDAY); while (it.hasNext()) { System.out.println(it.next()); } } } 
 package org.life.java.so.questions; import org.joda.time.DateTime; import org.joda.time.DateTimeConstants; /** * * @author Jigar */ public class JodaTimeDateTraverseQuestion { public static void main(String[] args) { DateTime startDt = new DateTime(2010,12,1,0,0,0,0);//1st Dec 2010 DateTime endDt = new DateTime(2010,12,31,0,0,0,0);//31st Dec 2010 DateTime tempDate = new DateTime(startDt.getMillis()); while(tempDate.compareTo(endDt) <=0 ){ if(tempDate.getDayOfWeek() != DateTimeConstants.SATURDAY && tempDate.getDayOfWeek() != DateTimeConstants.SUNDAY){ System.out.println(""+tempDate); } tempDate = tempDate.plusDays(1); } } } 

TL;博士

 java.time.LocalDate.of( 2018 , Month.JANUARY , 23 ) // A date-only class in the modern *java.time* classes that supplant both Joda-Time and the troublesome old date-time classes. .with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) // Nifty `TemporalAdjuster` implementation for moving to another date. Immutable Objects pattern means a new object is returned based on the original which remains unmodified. ) .isBefore( // Compare `LocalDate` objects with `isBefore`, `isAfter`, and `isEqual`. LocalDate.of( 2018 , Month.FEBRUARY , 27 ); ) 

java.time

仅供参考, Joda-Time项目现在处于维护模式 ,团队建议迁移到java.time类。

定义stop和start LocalDate对象。

 LocalDate start = LocalDate.of( 2018 , Month.JANUARY , 23 ); LocalDate stop = LocalDate.of( 2018 , Month.FEBRUARY , 27 ); // TODO: Verify start.isBefore( stop ). 

收集我们发现的星期五日期。 您可以通过调整集合大小来优化一点。

 // Pre-size the collection. int initialCapacity = ( int ) ( ChronoUnit.WEEKS.between( start , stop ) + 2 ); // Adding two for good measure. List < LocalDate > fridays = new ArrayList <>( initialCapacity ); 

如果它本身是星期五,则使用开始日期确定第一个星期五。 使用TemporalAdjusters类中提供的一对TemporalAdjuster实现: next​(DayOfWeek)nextOrSame​(DayOfWeek) 。 通过DayOfWeek enum传递所需的星期几,七个预定义的对象,一个星期一到星期日的每一天。

 LocalDate friday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.FRIDAY ) ); while ( friday.isBefore( stop ) ) { fridays.add( friday ); // Remember this Friday date. // Setup next loop. friday = friday.with( TemporalAdjusters.next( DayOfWeek.FRIDAY ) ); } System.out.println( "From " + start + " to " + stop + " = " + fridays ); 

2018-01-23至2018-02-27 = [2018-01-26,2018-02-02,2018-02-09,2018-02-16,2018-02-23]


关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

您可以直接与数据库交换java.time对象。 使用符合JDBC 4.2或更高版本的JDBC驱动程序 。 不需要字符串,不需要java.sql.*类。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • 更高版本的Android捆绑java.time类的实现。
    • 对于早期的Android, ThreeTenABP项目采用ThreeTen-Backport (如上所述)。 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。