在两个日期之间进行迭代,包括开始日期?

时间:2014-07-22 07:56:59

标签: java calendar simpledateformat gregorian-calendar

对于重复提问的道歉表示歉心。

public static void main(String[] args)throws Exception {
    GregorianCalendar gcal = new GregorianCalendar();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM");
    Date start = sdf.parse("2010.01");
    Date end = sdf.parse("2010.04");
    gcal.setTime(start);
    while (gcal.getTime().before(end)) {
        gcal.add(Calendar.MONTH, 1);
        Date d = gcal.getTime();
        System.out.println(d);
    }
}

在上面的代码中确切地打印日期之间但我需要打印开始日期..

上面的代码输出是

Mon Feb 01 00:00:00 IST 2010
Mon Mar 01 00:00:00 IST 2010
Thu Apr 01 00:00:00 IST 2010

但我还需要在输出上开始约会..

请帮我解决这个问题 提前谢谢..

5 个答案:

答案 0 :(得分:7)

在我看来,这是最好的方式:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM");
Date start = sdf.parse("2010.01");
Date end = sdf.parse("2010.04");

GregorianCalendar gcal = new GregorianCalendar();
gcal.setTime(start);

while (!gcal.getTime().after(end)) {
    Date d = gcal.getTime();
    System.out.println(d);
    gcal.add(Calendar.MONTH, 1);
}

输出:

Fri Jan 01 00:00:00 WST 2010
Mon Feb 01 00:00:00 WST 2010
Mon Mar 01 00:00:00 WST 2010
Thu Apr 01 00:00:00 WST 2010

我们所做的只是在递增之前打印日期,然后如果日期不在结束日期之后再重复。

另一种选择是在while(yuck)之前复制打印代码或使用do...while(也是yuck)。

答案 1 :(得分:3)

您可以使用do-while循环,但是您需要更改end日期,具体取决于您是否要包含它。

以下示例包括01或04之间的所有月份......

try {
    Calendar gcal = Calendar.getInstance();
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM");
    Date start = sdf.parse("2010.01");
    Date end = sdf.parse("2010.05");
    gcal.setTime(start);
    do {
        Date d = gcal.getTime();
        System.out.println(d);
        gcal.add(Calendar.MONTH, 1);
    } while (gcal.getTime().before(end));
} catch (ParseException exp) {
    exp.printStackTrace();
}

示例输出......

Fri Jan 01 00:00:00 EST 2010
Mon Feb 01 00:00:00 EST 2010
Mon Mar 01 00:00:00 EST 2010
Thu Apr 01 00:00:00 EST 2010

同样,您可以简单地使用当前代码并将start Date更改为一个月前...

Date start = sdf.parse("2009.12");
//...

<强>更新

另一种方法,基于以前的想法...

在开始循环之前,只需将start日期移回一个月......

Calendar gcal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM");
Date start = sdf.parse("2010.01");
Date end = sdf.parse("2010.04");
gcal.setTime(start);
// Move the month back by one before we start...
gcal.add(Calendar.MONTH, -1);
while (gcal.getTime().before(end)) {
    gcal.add(Calendar.MONTH, 1);
    Date d = gcal.getTime();
    System.out.println(d);
}

这相当简单,允许您提供可变日期而无需记住您需要提前一个月开始....

答案 2 :(得分:1)

您可以在循环开始之前输出它:

System.out.println(gcal.getTime());
while (gcal.getTime().before(end)) {
    gcal.add(Calendar.MONTH, 1);
    Date d = gcal.getTime();
    System.out.println(d);
}

答案 3 :(得分:1)

然后就这样做:

Date lNow = gcal.getTime();
System.out.println(lNow);

while (gcal.getTime().before(end)) {
        gcal.add(Calendar.MONTH, 1);
        Date d = gcal.getTime();
        System.out.println(d);
}

答案 4 :(得分:1)

从Java 8开始,您可以使用新的java.time API:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuu.MM");
YearMonth date = YearMonth.parse("2010.01", formatter);
YearMonth end = YearMonth.parse("2010.05", formatter);
while (!date.isAfter(end)) {
    System.out.println(date.format(formatter));
    date = date.plusMonths(1);
}