Java 乔达时间-两个日期之间的所有星期一

Java 乔达时间-两个日期之间的所有星期一,java,datetime,jodatime,days,Java,Datetime,Jodatime,Days,我第一次在Spring3.0项目中使用Joda时间api。现在我有了一个开始和结束日期,我想知道这两个日期之间所有周一的日期。我该怎么做 我不知道从哪里开始,请有人给我建议。我看了一下这篇文章,它提供了一些指导,但由于与乔达的经验不足,它仍然有些模糊 我最近开发了一款专门用于解决这个确切用例的软件: LocalDate startDate = new LocalDate(2011, 11, 8); LocalDate endDate = new LocalDate(2012, 5, 1); L

我第一次在Spring3.0项目中使用Joda时间api。现在我有了一个开始和结束日期,我想知道这两个日期之间所有周一的日期。我该怎么做

我不知道从哪里开始,请有人给我建议。我看了一下这篇文章,它提供了一些指导,但由于与乔达的经验不足,它仍然有些模糊

我最近开发了一款专门用于解决这个确切用例的软件:

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);
}
Dates.from(2011, 11, 8).to(2011, 12, 30).byWeek().on(DayOfWeek.MONDAY).build();
您将获得以下内容的
列表

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"));
}
}
导入java.time.LocalDate;
导入java.util.ArrayList;
导入java.util.List;
公共课上课时间{
公共数组列表getmondays(字符串s、字符串e)
{
LocalDate start=LocalDate.parse;
LocalDate end=LocalDate.parse(e);
List totalDates_Mondays=new ArrayList();
而(!start.isAfter(end)){
totalDates_周一。添加(开始);
start=start.PLUSWEKS(1);
}
返回(ArrayList)总日期(周一);
}
公共静态无效主(字符串…s1){
字符串mon_start=“1600-08-01”;
字符串mon_end=“2016-12-29”;
获取时间t=新获取时间();
System.out.println(t.getmondays(周一开始,周一结束));
}
}
仅供参考,该项目目前正在进行中,团队建议迁移到这些类

使用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<LocalDate> mondays = new ArrayList<>();
顺便说一句,处理时间跨度的明智方法通常是半开放的,即开始是包含的,而结束是独占的。因此,在上面的代码中,我们运行到但不包括
stop
日期

如果结尾是包含性的,则使用否定,例如

在这里,
monday
不在
stop
之后意味着它在
stop
之前或之前


关于java.time 该框架内置于Java8及更高版本中。这些类取代了麻烦的旧日期时间类,例如,&

要了解更多信息,请参阅。并搜索堆栈溢出以获得许多示例和解释。规格是

该项目现已启动,建议迁移到类

您可以直接与数据库交换java.time对象。使用兼容的或更高版本。不需要字符串,也不需要
java.sql.*
类。Hibernate5和JPA2.2支持java.time

从哪里获得java.time类

  • 、和更高版本-标准Java API的一部分,带有捆绑实现。
    • 带来了一些小功能和修复
    • 大多数java.time功能都在中向后移植到Java6和Java7
    • Android(26+)的更高版本捆绑了java.time类的实现

    • 对于早期的Android(,在Java8中使用Stream

      LocalDate startDate = LocalDate.of(2019, 2, 1);
      LocalDate endDate = LocalDate.of(2019, 2, 28);
      long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);
      List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).filter( date -> date.getDayOfWeek()==DayOfWeek.MONDAY ).collect(Collectors.toList());
      
      localdatestartdate=LocalDate.of(2019,2,1);
      LocalDate endDate=LocalDate.of(2019,2,28);
      long numOfDays=ChronoUnit.DAYS.between(开始日期、结束日期);
      List daysRange=Stream.iterate(startDate,date->date.plusDays(1)).limit(numOfDays).filter(date->date.getDayOfWeek()==DayOfWeek.MONDAY).collect(Collectors.toList());
      
      有没有一种方法可以计算开始和结束日期之间的所有天数,但跳过周末或可能跳过周六或周日?最好对OP的代码进行一些解释,因为我仍然没有掌握的第一篇帖子会相应地改变
      LocalDate monday = start.with( TemporalAdjusters.nextOrSame( DayOfWeek.MONDAY ) );
      while( monday.isBefore( stop ) ) {
          mondays.add( monday );
          // Set up the next loop.
          monday = monday.plusWeeks( 1 );
      }
      
      while( !monday.isAfter( stop ) ) {
          //...
      }
      
      LocalDate startDate = LocalDate.of(2019, 2, 1);
      LocalDate endDate = LocalDate.of(2019, 2, 28);
      long numOfDays = ChronoUnit.DAYS.between(startDate, endDate);
      List<LocalDate> daysRange = Stream.iterate(startDate, date -> date.plusDays(1)).limit(numOfDays).filter( date -> date.getDayOfWeek()==DayOfWeek.MONDAY ).collect(Collectors.toList());