개발/JAVA, Spring

[Java] "20231222" 문자열을 받아 날짜 계산 하기(with. LocalDate, DateTimeFormatter)

똘똘이박사 2023. 12. 22. 15:10

상황.

화면 또는 다른 프로세스에서 "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);

 

 

반응형