Joda时间 – 两个日期之间的所有星期一

我第一次在Spring 3.0项目中使用Joda time api。 现在我有一个开始和结束日期,我想得到这两个日期之间所有星期一的日期。 我怎样才能做到这一点 ?

我不知道从哪里开始,有人可以建议。 我查看了Joda Time的post:如何在某个日期间隔获取工作日的日期? 它提供了某种指导,但由于对joda的经验不足,它仍然有些模糊。

LocalDate startDate = new LocalDate(2011, 11, 8); LocalDate endDate = new LocalDate(2012, 5, 1); LocalDate thisMonday = startDate.withDayOfWeek(DateTimeConstants.MONDAY); if (startDate.isAfter(thisMonday)) { startDate = thisMonday.plusWeeks(1); // start on next monday } else { startDate = thisMonday; // start on this monday } while (startDate.isBefore(endDate)) { System.out.println(startDate); startDate = startDate.plusWeeks(1); } 

我最近开发了Lamma ,旨在解决这个确切的用例:

 Dates.from(2011, 11, 8).to(2011, 12, 30).byWeek().on(DayOfWeek.MONDAY).build(); 

你会得到一个List

 Date(2011,11,14) Date(2011,11,21) Date(2011,11,28) Date(2011,12,5) Date(2011,12,12) Date(2011,12,19) Date(2011,12,26) 

此代码用于字符串日期,并给出星期日的数量以及所有星期日的日期

 import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class FindAllSundays { public static int getNumberofSundays(String d1, String d2) throws Exception { // object // in // Date // form Date date1 = getDate(d1); Date date2 = getDate(d2); Calendar c1 = Calendar.getInstance(); c1.setTime(date1); Calendar c2 = Calendar.getInstance(); c2.setTime(date2); int sundays = 0; while (c2.after(c1)) { // System.out.println(" came here "); //checks to see if the day1 ....so on next days are sundays if sunday goes inside to increment the counter if (c1.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) { System.out.println(c1.getTime().toString() + " is a sunday "); sundays++; } c1.add(Calendar.DATE, 1); } System.out.println("number of sundays between 2 dates is " + sundays); return sundays; } // converts string to date public static Date getDate(String s) { DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); Date date = null; try { date = format.parse(s); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return date; } public static void main(String[] arg) throws Exception { System.out.println(" " + getNumberofSundays("2005-10-07", "2006-10-01")); } 

}

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

使用java.time

LocalDate类是java.time类似于Joda-Time LocalDate 。 仅限日期的值,没有时间和没有时区。 一个区别是java.time避开了工厂方法的构造函数。

 LocalDate start = LocalDate.of( 2011 , 11 , 8 ); LocalDate stop = LocalDate.of( 2012 , 5 , 1 ); 

收集星期一。

 List mondays = new ArrayList<>(); 

TemporalAdjuster接口提供操作日期时间值的类。 TemporalAdjusters类(注意复数名称)提供了各种实现。 我们想要nextOrSamenext调整器,传递所需的DayOfWeek.MONDAY枚举对象。

 LocalDate monday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) ); while( monday.isBefore( stop ) ) { mondays.add( monday ); // Set up the next loop. monday = monday.plusWeeks( 1 ); } 

顺便说一下,通常处理一段时间的明智方法是半开放,其中开头是包容性的,而结尾是独占的 。 因此,在上面的代码中,我们正在运行,但不包括stop日期。


关于java.time

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

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

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

从哪里获取java.time类?

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

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

 import java.time.LocalDate; import java.util.ArrayList; import java.util.List; public class Get_time { public ArrayList getmondays(String s,String e) { LocalDate start = LocalDate.parse(s); LocalDate end = LocalDate.parse(e); List totalDates_Mondays = new ArrayList<>(); while (!start.isAfter(end)) { totalDates_Mondays.add(start); start = start.plusWeeks(1); } return (ArrayList) totalDates_Mondays; } public static void main(String ...s1) { String mon_start = "1600-08-01"; String mon_end= "2016-12-29"; Get_time t=new Get_time(); System.out.println(t.getmondays(mon_start,mon_end)); } }