답변:
글쎄, 이 문제에 대해 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
수업.
import
명령문을 변경하십시오 .
그러나 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.Calendar
Java8을 아직 사용하지 않는 경우 의 레거시 접근 방식은 다음과 같습니다 .
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 9 는 datesUntil () 메소드를 추가했습니다 .
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)) {
// ...
}
addDays(..)
넣으면 더 짧아집니다.
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
}
}
우리는 논리를 Java 7, Java 8 및 Java 9와 같은 다양한 방법으로 마이그레이션 할 수 있습니다 .
public static List<Date> getDatesRangeJava7(Date startDate, Date endDate) {
List<Date> datesInRange = new ArrayList<>();
Calendar startCalendar = new GregorianCalendar();
startCalendar.setTime(startDate);
Calendar endCalendar = new GregorianCalendar();
endCalendar.setTime(endDate);
while (startCalendar.before(endCalendar)) {
Date result = startCalendar.getTime();
datesInRange.add(result);
startCalendar.add(Calendar.DATE, 1);
}
return datesInRange;
}
public static List<LocalDate> getDatesRangeJava8(LocalDate startDate, LocalDate endDate) {
int numOfDays = (int) ChronoUnit.DAYS.between(startDate, endDate);
return IntStream.range(0, numOfDays)
.mapToObj(startDate::plusDays)
.collect(Collectors.toList());
}
public static List<LocalDate> getDatesRangeJava9(LocalDate startDate, LocalDate endDate) {
return startDate.datesUntil(endDate).collect(Collectors.toList());
}
그런 다음 이러한 메소드를 다음과 같이 호출 할 수 있습니다.
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date startDate = formatter.parse("2010-12-20");
Date endDate = formatter.parse("2010-12-26");
List<Date> dateRangeList = getDatesRangeJava7(startDate, endDate);
System.out.println(dateRangeList);
LocalDate startLocalDate = startDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
LocalDate endLocalDate = endDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
List<LocalDate> dateRangeList8 = getDatesRangeJava8(startLocalDate, endLocalDate);
System.out.println(dateRangeList8);
List<LocalDate> dateRangeList9 = getDatesRangeJava8(startLocalDate, endLocalDate);
System.out.println(dateRangeList9);
결과는 다음과 같습니다.
[12 월 20 일 00:00:00 IST 2010, 12 월 21 일 화요일 00:00:00 IST 2010, 수 12 월 22 일 00:00:00 IST 2010, 12 월 23 일 00:00:00 IST 2010, 12 월 24 일 금요일 00 : 00:00 IST 2010, 12 월 25 일 (토) 00:00:00 IST 2010]
[2010-12-20, 2010-12-21, 2010-12-22, 2010-12-23, 2010-12-24, 2010-12-25]
[2010-12-20, 2010-12-21, 2010-12-22, 2010-12-23, 2010-12-24, 2010-12-25]
Date
및 Calendar
클래스에 의해 대체되었다 java.time의 년 전 클래스. 구체적으로 Instant
and 로 대체되었습니다 ZonedDateDate
.
다음은 Java 8 코드입니다. 이 코드가 문제를 해결할 것이라고 생각합니다. 행복한 코딩
LocalDate start = LocalDate.now();
LocalDate end = LocalDate.of(2016, 9, 1);//JAVA 9 release date
Long duration = start.until(end, ChronoUnit.DAYS);
System.out.println(duration);
// Do Any stuff Here there after
IntStream.iterate(0, i -> i + 1)
.limit(duration)
.forEach((i) -> {});
//old way of iteration
for (int i = 0; i < duration; i++)
System.out.print("" + i);// Do Any stuff Here
에포크 (epoch)를 사용하고 쉽게 루프 스루하지 마십시오.
long startDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(startDate).getTime() / 1000;
long endDateEpoch = new java.text.SimpleDateFormat("dd/MM/yyyy").parse(endDate).getTime() / 1000;
long i;
for(i=startDateEpoch ; i<=endDateEpoch; i+=86400){
System.out.println(i);
}
iterator 인터페이스 구현과 같은 클래스를 작성하고 반복 할 수 있습니다.
public class DateIterator implements Iterator<Date>, Iterable<Date>
{
private Calendar end = Calendar.getInstance();
private Calendar current = Calendar.getInstance();
public DateIterator(Date start, Date end)
{
this.end.setTime(end);
this.end.add(Calendar.DATE, -1);
this.current.setTime(start);
this.current.add(Calendar.DATE, -1);
}
@Override
public boolean hasNext()
{
return !current.after(end);
}
@Override
public Date next()
{
current.add(Calendar.DATE, 1);
return current.getTime();
}
@Override
public void remove()
{
throw new UnsupportedOperationException(
"Cannot remove");
}
@Override
public Iterator<Date> iterator()
{
return this;
}
}
그것을 다음과 같이 사용하십시오 :
Iterator<Date> dateIterator = new DateIterator(startDate, endDate);
while(dateIterator.hasNext()){
Date selectedDate = dateIterator .next();
}
이렇게하면 30 일 전에 시작하여 오늘 날짜까지 반복 할 수 있습니다. 날짜와 방향의 범위를 쉽게 변경할 수 있습니다.
private void iterateThroughDates() throws Exception {
Calendar start = Calendar.getInstance();
start.add(Calendar.DATE, -30);
Calendar end = Calendar.getInstance();
for (Calendar date = start; date.before(end); date.add(Calendar.DATE, 1))
{
System.out.println(date.getTime());
}
}