我想列出给定日期范围之间的日期,例如 -
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帮助我...
答案 0 :(得分:1)
基本上,你应该做两件事。
add
Calendar
之后,您需要检查现在是after
结束时间和例如
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
注意:这些代码片段都没有做的一件事是检查列表中的最后一个日期是否实际上是结束日期(尽管从它的外观来看,你的似乎是能够解决这个需求)