在while循环中使用Calendar?

时间:2016-08-09 22:11:19

标签: java while-loop calendar

下面的代码执行我想要的操作,除了最后一个输出。

Calendar cal = Calendar.getInstance();
    cal.clear();
    cal.set(1986,  8, 20);
    int year = cal.get(Calendar.YEAR);
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
    while (year >= cal.get(Calendar.YEAR)) {
        cal.add(Calendar.DAY_OF_MONTH, 7);
        System.out.println(sdf.format(cal.getTime()));
    }

这是输出:

1986-09-27
1986-10-04
1986-10-11
1986-10-18
1986-10-25
1986-11-01
1986-11-08
1986-11-15
1986-11-22
1986-11-29
1986-12-06
1986-12-13
1986-12-20
1986-12-27
1987-01-03

我将使用这个while循环来执行不可逆转的代码,我希望它在年份不是1987年。但是,1987年出现在这里,我尝试修改while循环条件获取最后一个条目

1986年12月27日

但无济于事。

除了没有1987年的日期外,所需的输出与上面的输出相同。

2 个答案:

答案 0 :(得分:3)

你的循环正在执行检查后执行添加。所以你可能只想要:

while (year >= cal.get(Calendar.YEAR)) {
    System.out.println(sdf.format(cal.getTime()));
    cal.add(Calendar.DAY_OF_MONTH, 7);
}

这将改变使用的第一个值,但是 - 如果您想要相同的第一个值,那么您可能需要在循环开始之前额外add调用此刻打印。

答案 1 :(得分:1)

java.time(Java 8)替代方案:

for(LocalDate date = LocalDate.of(1986, 9, 27);
        date.getYear() < 1987;
        date = date.plusWeeks(1)) {
    System.out.println(DateTimeFormatter.ISO_DATE.format(date));
}

输出:

1986-09-27
1986-10-04
1986-10-11
1986-10-18
1986-10-25
1986-11-01
1986-11-08
1986-11-15
1986-11-22
1986-11-29
1986-12-06
1986-12-13
1986-12-20
1986-12-27