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

标签 java date calendar

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

例如: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 循环中的条件应该是什么,我不明白,请帮助我...

最佳答案

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

  1. 日历添加值后,您需要检查现在是否在结束时间之后并且
  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

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

关于java - 获取给定日期范围内月份的开始日期和结束日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20593142/

相关文章:

java - 如何通过比较同一行上的三个变量来返回 boolean 值?

java - 比较 JUnit 中的 2 个对象

javascript - 启用 DatePicker 的特定日期

import - 使用 .ics 文件可以删除旧事件吗?

javascript - 如何使用 appium 驱动程序按 id 滚动到元素

java - RxJava 嵌套 Zip 操作不返回

python - 在python中将字符串日期转换为日期格式?

javascript - Chrome 58.0.3029.110 版本未将日期转换为正确的本地时区

bash - 使用 sed 替换动态生成的字符串

python - 更改日历的 django 管理模板