알이즈웰

날짜 변환 관련(LocalDate, LocalDateTime) 본문

Programming/JAVA

날짜 변환 관련(LocalDate, LocalDateTime)

2019. 6. 12. 18:39

운영 수정건

배송완료일(당일포함) 9일째되는 날부터 반품/교환 신청 시 불가하도록 validation 체크를 추가하는 것.

 

date 포맷을 이것저것 바꿨던 내용을 기록해본다.

// ------------------------------- //
// 처음 커밋했던 코드
// ------------------------------- //
LocalDate nowDate = LocalDate.now();
nowDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate completeDt;

try {
	SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
	completeDt = LocalDate.parse(dateFormat.format(dateFormat.parse(orderDto.getCompleteDt())));
}catch (DateTimeParseException e){
	throw new ParameterValidationException("날짜형식(yyyy-MM-dd)이 맞지 않습니다.");
}

// 배송완료일(당일포함) 9일째부터 신청 불가
if (completeDt.plusDays(7).isBefore(nowDate)){
	throw new ParameterValidationException("클레임 신청 가능 기간이 종료되었습니다.");
}

// ------------------------------- //
// 1차 수정 - 불필요한 변환 삭제
// ------------------------------- //
LocalDate nowDate = LocalDate.now();
LocalDate completeDt;

try {
	completeDt = LocalDate.from(LocalDateTime.parse(orderDto.getCompleteDt(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}catch (DateTimeParseException e){
	throw new ParameterValidationException("날짜형식(yyyy-MM-dd)이 맞지 않습니다.");
}

// 배송완료일(당일포함) 9일째부터 신청 불가
if (completeDt.plusDays(7).isBefore(nowDate)){
throw new ParameterValidationException("클레임 신청 가능 기간이 종료되었습니다.");
}

// ------------------------------- //
// 2차 수정 - try catch 삭제
// ------------------------------- //
LocalDate nowDate = LocalDate.now();
LocalDate completeDt = LocalDate.from(LocalDateTime.parse(orderDto.getCompleteDt(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

// 배송완료일(당일포함) 9일째부터 신청 불가
if (completeDt.plusDays(7).isBefore(nowDate)){
throw new ParameterValidationException("클레임 신청 가능 기간이 종료되었습니다.");
}

 

- 처음 코드

 마음에 안들었던 점

1. SimpleDateFormat으로 일일이 포맷 설정

2. completeDt에 SimpleDateFormat를 이용해서 String을 Date로 바꿨다가, format 맞췄다가, 그걸 또 LocalDate로 변환.. 이렇게 몇번을 변환시키는 것이 내키지 않았다.

  -> String을 원하는 포맷으로 변경하는건 SimpleDateFormat를 이용해서 하라고 stackoverflow에도 나오긴했다.

     참고 : https://krksap.tistory.com/1158 여길 통해서 아래 페이지 확인함.

               https://stackoverflow.com/questions/18873014/parse-string-date-in-yyyy-mm-dd-format

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date convertedCurrentDate = sdf.parse("2013-09-18");
String date=sdf.format(convertedCurrentDate );
System.out.println(date);

USE

String convertedCurrentDate =sdf.format(sdf.parse("2013-09-18"));

OUTPUT

2013-09-18

 

- 1차 수정

개선내용 : 불필요한 변환 삭제

LocalDate nowDate = LocalDate.now(); // 원래 yyyy-MM-dd 형식으로 나옴
//nowDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd")); -> 삭제

그러므로, 굳이 

nowDate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));

이렇게 변환해줄 필요가 없다.

//SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
//completeDt = LocalDate.parse(dateFormat.format(dateFormat.parse(orderDto.getCompleteDt())));
completeDt = LocalDate.from(LocalDateTime.parse(orderDto.getCompleteDt(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));

1. SimpleDateFormat을 "yyyy-MM-dd"로 선언하고

2. String -> Date

    SimpleDateFormat.parse(String)

3. Date -> String

    SimpleDateFormat.format(Date)

4. String -> LocalDate

    LocalDate.parse(String)

요 4 단계에서

1. String -> LocalDateTime

    LocalDateTime.parse(String, DateTimeFormatter.ofPattern(원하는 패턴))

2. LocalDateTime -> LocalDate

    LocalDate.from(LocalDateTime)

요로코롬 2단계로 변경. 최대한 LocalDate로 써먹으려했다.

* 참고로 난 yyyy-MM-dd HH:mm:ss 이렇게 되어있는 일별 비교를 했어야했다. 

 

- 2차 수정

개선내용 : try catch 삭제

어차피 completeDt라는 값은 DB에 yyyy-MM-dd HH:mm:ss로 저장되는 값이고, 있을때만 가져오도록 조건도 달아놓았으니(이 코드에는 없지만 그렇게 해놓았다.) 삭제.

* 쿼리 조회 시 그냥 해당 컬럼만 조회해오면 yyyy-MM-dd HH:mm:ss.0 가 붙는 요상한 현상이 있다.

그래서 쿼리도 date_format을 붙혀 수정해줬어야 했다.

 

 

- 시행착오들

LocalDate, LocalDateTime을 yyyy-MM-dd 변환 시 에러들 적기 (기록용)

String testDateTime = "2019-06-13 17:13:06";
String testDate = "2019-06-13";

SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("1. LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\")) : "+LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
System.out.println("2. LocalDate.parse(testDate, DateTimeFormatter.ofPattern(\"yyyy-MM-dd\")) : "+LocalDate.parse(testDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
//System.out.println("3. LocalDateTime.parse(testDate) : "+LocalDateTime.parse(testDate));
// DateTimeParseException -> Text '2019-06-13' could not be parsed at index 10
//System.out.println("4. LocalDateTime.parse(testDateTime) : "+LocalDateTime.parse(testDateTime));
// DateTimeParseException -> Text '2019-06-13 17:13:06' could not be parsed at index 10
System.out.println("5. LocalDate.from(LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern(\"yyyy-MM-dd HH:mm:ss\"))) : "+LocalDate.from(LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))));
//System.out.println("6. LocalDate.parse(testDateTime, DateTimeFormatter.ofPattern(\"yyyy-MM-dd\")) : "+LocalDate.parse(testDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd")));
// DateTimeParseException -> Text '2019-06-13 17:13:06' could not be parsed, unparsed text found at index 10

System.out.println("7. dateFormat.parse(testDateTime) 얘는 Date 타입.: "+dateFormat.parse(testDateTime)); // 결과 : Thu Jun 13 00:00:00 KST 2019
System.out.println("8. dateFormat.format(dateFormat.parse(testDateTime)) 얘는 String 타입.: "+dateFormat.format(dateFormat.parse(testDateTime)));
System.out.println("9. LocalDate.parse(dateFormat.format(dateFormat.parse(testDateTime))) 얘는 LocalDate 타입 : "+LocalDate.parse(dateFormat.format(dateFormat.parse(testDateTime))));

수행결과.

1. LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")) : 2019-06-13T17:13:06 2. LocalDate.parse(testDate, DateTimeFormatter.ofPattern("yyyy-MM-dd")) : 2019-06-13
5. LocalDate.from(LocalDateTime.parse(testDateTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))) : 2019-06-13
7. dateFormat.parse(testDateTime) 얘는 Date 타입.: Thu Jun 13 00:00:00 KST 2019
8. dateFormat.format(dateFormat.parse(testDateTime)) 얘는 String 타입.: 2019-06-13
9. LocalDate.parse(dateFormat.format(dateFormat.parse(testDateTime))) 얘는 LocalDate 타입 : 2019-06-13

* 참고

https://krksap.tistory.com/1158

https://stackoverflow.com/questions/18873014/parse-string-date-in-yyyy-mm-dd-format

https://jekalmin.tistory.com/entry/자바-18-날짜-정리

 

 

* 개인적인 경험을 기록용으로 적는 내용

 

 

 

 

 

 

 

 

 

 

 

 

Comments