[java] Java에서 날짜 범위를 반복하는 방법은 무엇입니까?

내 스크립트에서 시작 날짜와 종료 날짜가 주어지면 날짜 범위를 통해 일련의 작업을 수행해야합니다.
Java를 사용하여이를 달성하기위한 지침을 제공해주십시오.

for ( currentDate = starDate; currentDate < endDate; currentDate++) {

}

위의 코드는 단순히 불가능하다는 것을 알고 있지만 달성하고자하는 것을 보여주기 위해 수행합니다.



답변

글쎄, 이 문제에 대해 Java 8의 time-API를 사용하여 이와 같은 작업을 수행 할 수 있습니다 java.time.LocalDate(또는 Java 7 이상에 해당하는 Joda Time 클래스)

for (LocalDate date = startDate; date.isBefore(endDate); date = date.plusDays(1))
{
    ...
}

나는 것 철저하게 사용하는 것이 좋습니다 java.time내장 이상 (또는 Joda 시간) Date/ Calendar수업.


답변

그러나 JodaTime은 완전성을 위해 및 / 또는 API 제공 기능을 선호하는 경우 표준 API 방식입니다.

java.util.Date아래와 같은 인스턴스로 시작할 때 :

SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = formatter.parse("2010-12-20");
Date endDate = formatter.parse("2010-12-26");

java.util.CalendarJava8을 아직 사용하지 않는 경우 의 레거시 접근 방식은 다음과 같습니다 .

Calendar start = Calendar.getInstance();
start.setTime(startDate);
Calendar end = Calendar.getInstance();
end.setTime(endDate);

for (Date date = start.getTime(); start.before(end); start.add(Calendar.DATE, 1), date = start.getTime()) {
    // Do your job here with `date`.
    System.out.println(date);
}

그리고 여기 Java8의 java.time.LocalDate접근법, 기본적으로 정확히 JodaTime 접근법이 있습니다.

LocalDate start = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate end = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();

for (LocalDate date = start; date.isBefore(end); date = date.plusDays(1)) {
    // Do your job here with `date`.
    System.out.println(date);
}

반복 처리가 당신이 원하는 경우 포괄적으로 다음, 종료 날짜를 사용 !start.after(end)하고 !date.isAfter(end)각각.


답변

java.time 클래스를 사용하는 Java 8 스타일 :

// Monday, February 29 is a leap day in 2016 (otherwise, February only has 28 days)
LocalDate start = LocalDate.parse("2016-02-28"),
          end   = LocalDate.parse("2016-03-02");

// 4 days between (end is inclusive in this example)
Stream.iterate(start, date -> date.plusDays(1))
        .limit(ChronoUnit.DAYS.between(start, end) + 1)
        .forEach(System.out::println);

산출:

2016-02-28
2016-02-29
2016-03-01
2016-03-02

대안 :

LocalDate next = start.minusDays(1);
while ((next = next.plusDays(1)).isBefore(end.plusDays(1))) {
    System.out.println(next);
}

Java 9datesUntil () 메소드를 추가했습니다 .

start.datesUntil(end.plusDays(1)).forEach(System.out::println);


답변

이것은 본질적으로 BalusC가 준 대답과 동일하지만 for 루프 대신 while 루프를 사용하면 좀 더 읽기 쉽습니다.

Calendar start = Calendar.getInstance();
start.setTime(startDate);

Calendar end = Calendar.getInstance();
end.setTime(endDate);

while( !start.after(end)){
    Date targetDay = start.getTime();
    // Do Work Here

    start.add(Calendar.DATE, 1);
}


답변

아파치 커먼즈

    for (Date dateIter = fromDate; !dateIter.after(toDate); dateIter = DateUtils.addDays(dateIter, 1)) {
        // ...
    }


답변

private static void iterateBetweenDates(Date startDate, Date endDate) {
    Calendar startCalender = Calendar.getInstance();
    startCalender.setTime(startDate);
    Calendar endCalendar = Calendar.getInstance();
    endCalendar.setTime(endDate);

    for(; startCalender.compareTo(endCalendar)<=0;
          startCalender.add(Calendar.DATE, 1)) {
        // write your main logic here
    }

}


답변

public static final void generateRange(final Date dateFrom, final Date dateTo)
{
    final Calendar current = Calendar.getInstance();
    current.setTime(dateFrom);

    while (!current.getTime().after(dateTo))
    {
        // TODO

        current.add(Calendar.DATE, 1);
    }
}