자바 날짜 리스트 - jaba naljja liseuteu

상세 컨텐츠

본문 제목

java 두날짜 사이 날짜 리스트 구하기

Java

by husks 2019. 4. 11. 16:34

본문

개발을 하다 보면 시작날짜와 종료날짜 사이의 날짜들을 출력하거나 저장해 사용할 경우가 있습니다.

1일씩 증가하는 날짜가 필요할때도 있고 한달씩 증가하는 날짜가 필요한 경우도 있습니다.

필요에 의해 개발 하였고 해당 소스를 기록합니다.

소스를 확인하시면 소스에 주석을 건 부분이 있는데 상황에 맞게 (1일 증가, 1달 증가) 풀어서 사용하시면 될 듯 합니다.


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

import java.text.SimpleDateFormat;

import java.util.Calendar;

public class NextMonth {

public static void main(String[] args) {

SimpleDateFormat dateFormat;

dateFormat = new SimpleDateFormat("yyyyMM"); //년월 표시

//dateFormat = new SimpleDateFormat("yyyyMMdd"); //년월일 표시

Calendar cal = Calendar.getInstance();

cal.set ( 20191-11 ); //종료 날짜 셋팅

String endDate = dateFormat.format(cal.getTime());

cal.set ( 20181-11 ); //시작 날짜 셋팅

String startDate = dateFormat.format(cal.getTime());    

int i = 0;

while(!startDate.equals(endDate)){ //다르다면 실행, 동일 하다면 빠져나감

if(i==0) { //최초 실행 출력

System.out.println(dateFormat.format(cal.getTime()));

}

cal.add(Calendar.MONTH, 1); //1달 더해줌

//cal.add(Calendar.DATE, 1); //1일 더해줌

startDate = dateFormat.format(cal.getTime()); //비교를 위한 값 셋팅

//+1달 출력

System.out.println(dateFormat.format(cal.getTime()));

i++;

}

}

}

관련글 더보기

  • 재고관리 프로그램 (회원관리)

    2019.10.29

  • java 다운로드 한글 깨짐

    2019.10.15

  • java 엑셀 파일 읽기 (xlsx)

    2019.03.08

private List<String> setDateList(String startDate, String endDate, String format) {

    List<String> dateList = new ArrayList<String>();

    SimpleDateFormat formatter = new SimpleDateFormat(format);

    try {

        Calendar beginDate = Calendar.getInstance();

        Calendar stopDate = Calendar.getInstance();

        beginDate.setTime(formatter.parse(startDate));

        stopDate.setTime(formatter.parse(endDate));

        while (beginDate.compareTo(stopDate) != 1) {

            dateList.add(formatter.format(beginDate.getTime()));

            beginDate.add(Calendar.DATE, 1);

        }

    } catch (Exception e) {

        e.printStackTrace();

    }

    return dateList;

}

start 날짜와

end 날짜를 집어넣고

날짜 포맷을 넣어주면

리스트로 돌려주는 프로그램...

사실 캘린더함수쓰면 딱히 안써도 되긴 함;

내 프로그램은 분단위로 계산해야되기때문에 지울 함수ㅠㅠ

날짜 정렬 방법

이번 포스팅은 Java에서 날짜 타입의 데이터로 구성된 배열 또는 ArrayList를 정렬하는 방법을 소개합니다.

Java에서 제공하는 날짜 클래스는 다양합니다.

다음 목록은 이번 포스팅에서 소개하는 방법을 적용할 수 있는 날짜 클래스입니다.

- Date

- LocalDate

- LocalDateTime

- ZonedDateTime

- OffsetDateTIme


Collections의 sort 메서드

java.util.Collections클래스에 있는 sort() 메서드는 매개변수로 전달된 List를 오름차순으로 정렬합니다.

이번 포스팅은 Stream API를 사용하는 방법을 제외하고 Collections 클래스의 sort() 메서드를 사용하여 날짜 타입의 List를 정렬합니다.

만약, 날짜 타입의 데이터로 구성된 ArrayList인 경우 다음 방법으로 List를 정렬할 수 있습니다.

정렬 방법

1. 오름차순으로 정렬하는 경우 sort() 메서드에 첫 번째 매개변수로 List를 전달합니다.

2. 내림차순으로 정렬하는 경우 sort() 메서드의 첫 번째 매개변수로 List를 전달하고 두 번째 매개변수로 Collections.reverseOrder()를 전달합니다.

public static void main(String args[]) {
  List<Date> dateList = new ArrayList<>();
  dateList.add(new Date(2020, 1, 1));
  dateList.add(new Date(2021, 5, 5));
  dateList.add(new Date(2020, 3, 10));
  dateList.add(new Date(2021, 7, 1));

  System.out.println("정렬 전");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });

  Collections.sort(dateList);

  System.out.println("\n오름차순 정렬");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });

  Collections.sort(dateList, Collections.reverseOrder());

  System.out.println("\n내림차순 정렬");
  dateList.forEach(item -> {
    System.out.println(item.getYear() + "년 " 
            + item.getMonth() + "월 " 
            + item.getDate() + "일");
  });
}

[실행 결과]

정렬 전
2020년 1월 1일
2021년 5월 5일
2020년 3월 10일
2021년 7월 1일

오름차순 정렬
2020년 1월 1일
2020년 3월 10일
2021년 5월 5일
2021년 7월 1일

내림차순 정렬
2021년 7월 1일
2021년 5월 5일
2020년 3월 10일
2020년 1월 1일

만약, List가 사용자 정의 클래스 타입으로 선언된 경우에는 날짜를 정렬하는 방법이 복잡합니다.

public class Person {
  private String Name;
  private Date date;
}

Collections 클래스의 sort() 메서드에 존재하는 기본 비교자가 어떤 기준으로 데이터를 정렬해야 할지 알 수 없기 때문입니다.

따라서, List가 사용자 정의 클래스 타입으로 선언된 경우 아래에서 소개하는 방법들을 적용하여 List를 정렬합니다.


사용자 정의 클래스

이번 포스팅에서 사용되는 Person 클래스입니다.

public class Person {
  private String Name;
  private Date date;

  public Person(String name, Date date) {
    Name = name;
    this.date = date;
  }

  public String getName() {
    return Name;
  }

  public void setName(String name) {
    Name = name;
  }

  public Date getDate() {
    return date;
  }

  public void setDate(Date date) {
    this.date = date;
  }
  
  @Override
  public String toString() {
    return "Person [Name=" + Name
            + ", date="
            + date.getYear() + "월 "
            + date.getMonth() + "월 "
            + date.getDate() + "일]";
  }
}

방법 1. 비교자 구현

첫 번째 방법으로 비교자를 구현하는 방법입니다.

정렬 방법

1. java.util.Comparator 인터페이스를 구현하는 클래스에서 compare() 메서드를 재정의합니다.

2. 해당 클래스의 인스턴스를 sort() 메서드의 두 번째 매개변수로 전달합니다.

3. 내림차순으로 정렬하고 싶은 경우 Comparator 인터페이스를 구현하는 클래스의 인스턴스 뒤에 reversed() 메서드를 호출합니다.

[비교자 - PersonComparator]

public class PersonComparator implements Comparator<Person> {
  @Override
  public int compare(Person person1, Person person2) {
    return Long.valueOf(person1.getDate().getTime())
            .compareTo(person2.getDate().getTime());
  }
}

[Main문]

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, new PersonComparator());

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, new PersonComparator().reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]

방법 2. 람다 표현식

두 번째 방법으로 람다 표현식을 사용하는 방법입니다.

정렬 방법

1. 비교자를 람다 표현식으로 작성합니다.

2. 람다 표현식을 sort() 메서드의 두 번째 매개변수로 전달합니다.

3. 내림차순으로 정렬하고 싶은 경우 람다 표현식 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  Comparator<Person> comparator = (prod1, prod2) -> Long.valueOf(
          prod1.getDate().getTime())
          .compareTo(prod2.getDate().getTime());

  Collections.sort(personList, comparator);

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  Collections.sort(personList, comparator.reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]

방법 3. 메서드 참조

세 번째 방법으로 메서드 참조를 사용하는 방법입니다.

비교자 구현, 람다 표현식과는 다르게 Collections 클래스의 sort() 메서드가 아닌 List 객체의 sort() 메서드를 사용합니다.

정렬 방법

1. List 객체의 sort() 메서드를 사용합니다.

2. 날짜 필드를 참조하는 메서드 참조문을 Comparator.comparing() 메서드의 매개변수로 전달합니다.

3. 2번 과정에서 작성한 Comparator.comparing() 메서드를 sort() 메서드의 매개변수로 전달합니다.

4. 내림차순으로 정렬하고 싶은 경우 Comparator.comparing() 메서드 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  personList.sort(Comparator.comparing(Person::getDate));

  System.out.println("\n오름차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));

  personList.sort(Comparator.comparing(Person::getDate).reversed());

  System.out.println("\n내림차순 정렬");
  personList.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]

방법 4. Stream API

마지막으로 Java 8 Version 이상인 경우 Stream API를 사용할 수 있습니다.

정렬 방법

1. stream() 메서드를 호출하여 List를 스트림으로 변환합니다.

2. 변환된 스트림을 정렬하기 위해 sorted() 메서드를 호출합니다.

3. 데이터를 정렬하기 위해 sorted() 메서드에 비교자를 전달합니다.

4. 정렬된 스트림을 List로 변환합니다.

5. 내림차순으로 정렬하고 싶은 경우 3번 과정에서 전달된 비교자 뒤에 reversed() 메서드를 호출합니다.

public static void main(String args[]) {
  Person person1 = new Person("둘리", new Date(2020, 1, 1));
  Person person2 = new Person("또치", new Date(2021, 5, 5));
  Person person3 = new Person("도넛", new Date(2020, 3, 10));
  Person person4 = new Person("생선", new Date(2021, 7, 1));

  List<Person> personList = new ArrayList<>();
  personList.add(person1);
  personList.add(person2);
  personList.add(person3);
  personList.add(person4);

  System.out.println("정렬 전");
  personList.forEach(item -> System.out.println(item.toString()));

  List<Person> personListAsc = personList
          .stream()
          .sorted(Comparator.comparing(Person::getDate))
          .collect(Collectors.toList());

  System.out.println("\n오름차순 정렬");
  personListAsc.forEach(item -> System.out.println(item.toString()));

  List<Person> personListDesc = personList
          .stream()
          .sorted(Comparator.comparing(Person::getDate).reversed())
          .collect(Collectors.toList());

  System.out.println("\n내림차순 정렬");
  personListDesc.forEach(item -> System.out.println(item.toString()));
}

[실행 결과]

정렬 전
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=생선, date=2021월 7월 1일]

오름차순 정렬
Person [Name=둘리, date=2020월 1월 1일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=생선, date=2021월 7월 1일]

내림차순 정렬
Person [Name=생선, date=2021월 7월 1일]
Person [Name=또치, date=2021월 5월 5일]
Person [Name=도넛, date=2020월 3월 10일]
Person [Name=둘리, date=2020월 1월 1일]