获取给定日期范围之间的开始日期和结束日期

时间:2013-12-15 09:37:11

标签: java date calendar

我想列出给定日期范围之间的日期,例如 -

ex:fromDate - 15/10/2013 and toDate - 15/12/2013

现在列表应该是

[15/10/2013,2013年10月31日,2013年1月1日,2013年3月30日,2013年1月12日,2013年12月15日]

我写了这段代码---

private List<Date> datesList = new ArrayList<Date>();

public void findLastDate(){
Date lastDateOfMonth;
Date firstDateOfNextMonth = null;

datesList.add(fromDate);

do {

Calendar calendar = Calendar.getInstance();  
if(firstDateOfNextMonth == null){
    calendar.setTime(fromDate);  
} else {
        calendar.setTime(firstDateOfNextMonth);  
}

calendar.add(Calendar.MONTH, 1);  
calendar.set(Calendar.DAY_OF_MONTH, 1);  
calendar.add(Calendar.DATE, -1);  

    lastDateOfMonth = calendar.getTime();  

    datesList.add(lastDateOfMonth);

    Calendar calendar2 = Calendar.getInstance();  
    calendar2.setTime(lastDateOfMonth);  

    calendar2.add(Calendar.MONTH, 1);  
    calendar2.set(Calendar.DAY_OF_MONTH, 1);  
    calendar2.add(Calendar.DATE, 0);  

    firstDateOfNextMonth = calendar2.getTime();  

    datesList.add(firstDateOfNextMonth);

} while(firstDateOfNextMonth.compareTo(toDate) < 0);

datesList.add(toDate);

    System.out.println("List of dates " + datesList);

}

但我得到一个列表

[2013年10月15日,2013年10月31日,2013年1月1日,2013年3月30日,2013年1月12日,2013年12月30日,2014年1月1日,15/12 / 2013]

日期30/12/2013,2014年1月1日不应该在列表中,所以应该是while循环中的条件我没有得到它plz帮助我...

1 个答案:

答案 0 :(得分:1)

基本上,你应该做两件事。

  1. add Calendar之后,您需要检查现在是after结束时间和
  2. 除非它等于结束时间,否则从列表中删除最后一个日期
  3. 例如

    List<Date> dates = new ArrayList<>(25);
    
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DATE, 15);
    cal.set(Calendar.MONTH, 9);
    cal.set(Calendar.YEAR, 2013);
    
    Calendar endCal = Calendar.getInstance();
    endCal.set(Calendar.DATE, 15);
    endCal.set(Calendar.MONTH, 11);
    endCal.set(Calendar.YEAR, 2013);
    
    dates.add(cal.getTime());
    while (cal.before(endCal)) {
    
        cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
        dates.add(cal.getTime());
        if (cal.before(endCal)) {
            cal.add(Calendar.DATE, 1);
            dates.add(cal.getTime());
        }
    
    }
    
    dates.remove(dates.size() - 1);
    dates.add(endCal.getTime());
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    for (Date d : dates) {
        System.out.println(sdf.format(d));
    }
    

    将输出

    15/10/2013
    31/10/2013
    01/11/2013
    30/11/2013
    01/12/2013
    15/12/2013
    

    根据原始代码更新了示例

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.DATE, 15);
    cal.set(Calendar.MONTH, 9);
    cal.set(Calendar.YEAR, 2013);
    Date fromDate = cal.getTime();
    
    Calendar endCal = Calendar.getInstance();
    endCal.set(Calendar.DATE, 15);
    endCal.set(Calendar.MONTH, 11);
    endCal.set(Calendar.YEAR, 2013);
    Date toDate = endCal.getTime();
    
    List<Date> datesList = new ArrayList<>(25);
    datesList.add(fromDate);
    
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(fromDate);
    do {
    
        calendar.add(Calendar.MONTH, 1);
        calendar.set(Calendar.DAY_OF_MONTH, 1);
        calendar.add(Calendar.DATE, -1);
    
        if (calendar.getTime().before(toDate)) {
    
            datesList.add(calendar.getTime());
    
            calendar.add(Calendar.MONTH, 1);
            calendar.set(Calendar.DAY_OF_MONTH, 1);
            calendar.add(Calendar.DATE, 0);
    
            if (calendar.getTime().before(toDate)) {
    
                datesList.add(calendar.getTime());
    
            }
    
        }
    
    } while (calendar.getTime().before(toDate));
    
    datesList.add(toDate);
    
    SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
    for (Date d : datesList) {
        System.out.println(sdf.format(d));
    }
    

    哪些输出......

    15/10/2013
    31/10/2013
    01/11/2013
    30/11/2013
    01/12/2013
    15/12/2013
    

    注意:这些代码片段都没有做的一件事是检查列表中的最后一个日期是否实际上是结束日期(尽管从它的外观来看,你的似乎是能够解决这个需求)