쥬로그
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff] 본문
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]
쥬쥬씨 2022. 1. 17. 00:04오라클 DB - JAVA
>> 원하는 형식으로 날짜 데이터 출력하기
문제 발생
Date 타입으로 logtime이라는 컬럼을 생성하고, DTO에서도 Date 데이터 타입으로 필드를 만들었다.
그리고 java에서 출력 쿼리문을 아래와 같이 작성했다.
to_char(logtime, 'yyyy.mm.dd') as logtime
String으로 필드를 생성했을때는 정상적으로 날짜가 출력됐는데, Date 타입으로 필드를 생성하니
java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss [. fffffffff] 에러가 났다.
Timestamp가 아닌데 왜 Timestamp format은 반드시 yyyy-dd hh:mm:ss로 맞추라는 걸까? 싶어서
to_char(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime
이렇게 코드를 변경해보았다.
에러는 나지 않았지만, 내가 원하는 값이 출력되지 않았다.
날짜가 출력되지 않고, Object가 표시된다.
그럼 to_char를 뺀
(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime
위 코드로 실행하면 어떻게 될까?
missing right parenthesis 이라는 에러가 발생했다.
to_date를 앞에 추가해보았다.
to_date(logtime, 'yyyy-mm-dd hh:mm:ss') as logtime
format code appears twice 라는 에러가 발생했다.
그럼 아예 format을 다 빼버리면 어떻게 될까?
logtime
logtime으로만 실행하면 에러는 발생하지 않지만, Object라고 또 출력된다.
이래저래 에러가 발생하거나 object가 출력된다.
logtime 필드 데이터타입이 Date니까, date 형식을 가져오면서도 format은 주어줘야 되는데,,,
어떻게 하면 내가 원하는 날짜가 출력될까?
해결하기
우선, 쿼리문에서 to_char를 사용하지 않았다.
DTO 필드 데이터타입도 Date니까 to_char로 가져오면 필드에 값이 저장되지 않을 거라 생각했다.
logtime 그대로 컬럼명에 사용하여 쿼리문을 날려 데이터를 가져왔고
Date 형식을 format에 맞게 출력하기 위해 SimpleDateFormat 를 사용했다.
String format = "yyyy.MM.dd";
SimpleDateFormat sdf = new SimpleDateFormat(format);
temp.put("logtime", sdf.format(boardDTO.getLogtime().getTime()));
Service에서 위와 같이 처리하였더니!
드디어 내가 원하는 형식으로 출력되었다.
여기서 또, 주의할 점은 format 지정 시 대문자 M을 사용해야 된다는 것이다.
소문자 m은 24시간을 나타낼 때 사용되기 때문에 꼭! 꼭! M을 사용하도록 하자.
정리하기
java.lang.IllegalArgumentException
메서드가 잘못되었거나 부적절한 인수가 전달되었음을 나타내기 위해 발생하는 예외
to_char 함수
date 데이터 타입이 가지는 기본 형태를 사용자의 편의에 따라 출력하고 싶을 때 사용