繁体   English   中英

获取给定日期范围内的月份的开始日期和结束日期

[英]To get start date and end date of months between the given dates range

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

例如:fromDate-15/10/2013和toDate-15/12/2013

现在列表应该是

[15/10 / 2013、31 / 10 / 2013、1 / 1 / 2013、30 / 11 / 2013、1 / 12 / 2013、15 / 12/2013]

我已经写了这段代码-

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);

}

但我得到一个清单

[15/10 / 2013、31 / 10 / 2013、1 / 1 / 2013、30 / 11 / 2013、1 / 12 / 2013、30 / 12 / 2013、1 / 1 / 2014、15 / 12/2013]

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

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

  1. addadd到“ Calendar ,需要检查是否现在是结束时间after ,并且
  2. 除非等于结束时间,否则从列表中删除最后一个日期

例如

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

注意:这两个代码段都没有做的一件事就是检查列表中的最后一个日期是否实际上是结束日期(尽管从外观上看,您似乎可以解决此需求)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM