我想制作给定日期范围之间的日期列表,例如--
例如:fromDate - 15/10/2013 和 toDate - 15/12/2013
现在列表应该是
[ 2013年10月15日、2013年10月31日、2013年1月1日、2013年11月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年11月30日、2013年1月12日、2013年12月30日、2014年1月1日、2013年12月15日]
日期 30/12/2013、1/1/2014 不应该出现在列表中,所以 while 循环中的条件应该是什么,我不明白,请帮助我...
最佳答案
基本上,你应该做两件事。
- 向
日历
添加
值后,您需要检查现在是否在结束时间之后
并且 - 除非等于结束时间,否则从列表中删除最后一个日期
例如
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
注意:这些代码片段都没有做的一件事是检查列表中的最后一个日期是否实际上是结束日期(尽管从外观上看,您的代码片段似乎能够解决此需求)
关于java - 获取给定日期范围内月份的开始日期和结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20593142/