알이즈웰
날짜 변환 관련(LocalDate, LocalDateTime) 본문
운영 수정건
배송완료일(당일포함) 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-날짜-정리
* 개인적인 경험을 기록용으로 적는 내용
'Programming > JAVA' 카테고리의 다른 글
JPA save 여러번 할 경우 update는 나중에 처리됨 (0) | 2021.06.22 |
---|---|
@Builder 사용 시 컴파일 오류(feat. 생성자) (0) | 2021.06.22 |
함수 호출 다이어그램 (0) | 2018.10.04 |
poi 사용하여 Java로 엑셀파일 생성 (2) | 2017.07.13 |
달의 마지막 날 찾기 (0) | 2017.07.10 |