상황.
화면 또는 다른 프로세스에서 "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);
'개발 > JAVA, Spring' 카테고리의 다른 글
[JAVA] enum 사용 (0) | 2023.11.10 |
---|---|
[JAVA] Util 클래스에서 세션 사용하기 (0) | 2021.08.02 |
[JAVA] 문자열에서 숫자만 남기고 제거하기 (replaceAll) (0) | 2021.06.16 |
[JAVA] 문자열에 특정 문자가 있는지 확인(matches 이용하기) (0) | 2021.06.09 |
[JAVA] 한글이 포함된 문자열 자르기 (0) | 2021.05.13 |