[Java] "20231222" 문자열을 받아 날짜 계산 하기(with. LocalDate, DateTimeFormatter)
상황.
화면 또는 다른 프로세스에서 "20231222" 형식으로 문자열을 받았다.
하루를 더하고 빼고 비교하는 등의 연산을 해야 한다.
예전(JDK7 이하 버전) 에서는 Calander이나 Date 객체를 사용했었다.
이 객체들에는 소소한 문제들이 있었는데, JDK8 버전부터 LocalDate, LocalTime, LocalDateTime 를 지원하기 시작하면서
그런 문제들이 사라졌다. 따라서 JDK8 이상의 버전을 사용하고 있다면 앞으로 이 객체들을 사용하자
날짜형 전환
우선 "20231222" 라는 문자열로 받은 데이터를 날짜 형식의 객체로 전환해야 한다.
LocalDate 에는 LocalDate.of(년, 월, 일) 이라는 훌륭한 메서드를 제공한다.
따라서 "20231222" 를 substring 로 년, 월, 일로 나눈 다음, 각각의 문자를 숫자로 변환해주어 대입하면 원하는 결과를 얻을 수 있다.
String ymd = "20231222";
String yyyy = ymd.substring(0,4);
String MM = ymd.substring(4,6);
String dd = ymd.substring(6);
LocalDate objYmd = LocalDate.of(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd));
System.out.println("objYmd: " + objYmd);
하지만 '년/월/일'로 문자열을 자르고 다시 형변환을 해야 하는 번거로움이 존재한다. 년/월/일 날짜를 자를때 자리 잘못 자르면 원치 않는 날짜를 만들어 낼 수도 있다.
그럼 위 코드를 아래와 같이 바꾸면 어떨까?
String ymd = "20231222";
//String yyyy = ymd.substring(0,4);
//String MM = ymd.substring(4,6);
//String dd = ymd.substring(6);
//LocalDate objYmd = LocalDate.of(Integer.parseInt(yyyy), Integer.parseInt(MM), Integer.parseInt(dd));
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate objYmd = LocalDate.parse(ymd, formatter);
System.out.println("objYmd: " + objYmd);
위 코드의 결과는 동일하다.
하지만 불필요한 문자열 자르기도 형변환도 없다.
단지 받은 날짜 데이터에 대한 패턴만 지정하였을 뿐이다. (그리고 3줄이 한 줄로 줄었다!)
어떤가? 더 깔끔하지 않은가?
그럼 이제 고객이 요청했던 날짜의 연산을 해보자
날짜연산
LocalDate, LocalTime, LocalDateTime 에서 제공하는 날짜 연산과 관련된 함수들은 정말 깔끔하다.
날짜를 더 하려면 plus, 날짜를 빼려면 minus 이다!
구분 | 년 | 월 | 일 | 주 |
더하기 | plusYears() | plusMonths() | plusDays() | plusWeeks() |
빼기 | minusYears() | minusMonths() | minusDays() | minusWeeks() |
정말 간단해 보이지 않는가?
"20231223" 에 10일 후 날짜를 뽑아 보자, 그럼 아래와 같을 것이다.
String ymd = "20231222";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate objYmd = LocalDate.parse(ymd, formatter);
LocalDate afterYmd = objYmd.plusDays(10);
System.out.println("afterYmd: " + afterYmd);
반환
이제 마무리 하자.
마지막 요구는 다시 "20231222" 와 같은 문자열 형식으로 데이터를 리턴 하는 것이다.
LocalDate 객체를 문자열로 변환해 줘야 한다. 주위해야 할 것은 위 결과들이 '년-월-일' 형식으로 구분자가 들어간다는 것이다.
따라서 구분자를 제거해 주는 구문을 넣어 줘야 한다.
String ymd = "20231222";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
LocalDate objYmd = LocalDate.parse(ymd, formatter);
String afterYmd = objYmd.plusDays(10).format(formatter);
System.out.println("objYmd: " + afterYmd);