본문 바로가기
목차
Spring (boot) 오류 해결

JSP 날짜 변환 에러(게시판, 오늘 게시글 날짜 구분하기)

by 지각생 2022. 2. 19.
728x90

최종 정리

 

@Controller

		Date today_date = new java.util.Date();
		DateFormat dateFormat_year = new SimpleDateFormat("yy/MM/dd");
		String today_str_year=dateFormat_year.format(today_date);

		model.addAttribute("today_str_year", today_str_year);

 

JSP

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<fmt:formatDate pattern="yy/MM/dd" value="${getWritingList.date}" var="date_year" /> 
<fmt:formatDate pattern="hh:mm:ss" value="${getWritingList.date}" var="date_hour" /> 
			<c:choose>
			<c:when test="${date_year == today_str_year}">
				<c:out value="${date_hour}" />
			</c:when>
			<c:otherwise>
				<c:out value="${date_year}" />
			</c:otherwise>
			</c:choose>

 

 

게시판 글 작성 중 오늘 등록된 게시글이면 시,분,초가 보이고

일자가 다르면 년,월,일이 보이게 하려 했다.

 

DB에는 TimeStamp의 Curren_TimeStamp였나? 이걸로 자동 등록 시켜주고

JSP에서는 

Date date = new java.util.Date();

로 현재 시간을 가져와서

서로 비교하려했다.

 

그런데 일단 TimeStamp와 Date는 형태가 달라서 변환이 필요해 보였다.

그래서

Date date = new java.util.Date();
long timestamp=date.getTime();

이렇게 date를 long타입으로 변환했더니.

 

Cannot convert [1,645,239,633,205] of type [class java.lang.Long] to [class java.util.Date]

변환할 수 없다고 에러가 떴다.

 

그래서 알아보니 아래와 같이 

fmt:parseDate String형 -> Date형태 변경

fmt:formatDate : Date형 -> 날짜형태 변경

가 있었다.

 

그래서

long timestamp=date.getTime();
String today=String.valueOf(timestamp);

.jsp파일에 가서는

<fmt:formatDate pattern="yy/MM/dd" value="${getWritingList.date}" var="date_year" /> 
<fmt:formatDate pattern="hh:mm:ss" value="${getWritingList.date}" var="date_hour" /> 
<fmt:formatDate pattern="yy/MM/dd" value="${today_str}" var="today_year" /> 
<c:choose>
	<c:when test="${date_year == today_year}">
		<c:out value="${date_hour}" />
	</c:when>
	<c:otherwise>
		<c:out value="${date_year}" />
	</c:otherwise>
</c:choose>

라고 썻지만 에러가 떴다.

 

 Unparseable date

 

 

해당 에러는 변환하려는 날짜 패턴이 입력되는 날짜 패턴과 달라서 발생하는 에러입니다.

0000-00-00 00:00:00.0 형식을 yyyyMMdd로 받아주려니까 안되는거다.

yyyy-MM-dd HH:mm:ss.s 라고 패턴을 바꿔주니까 잘된다.

 

하지만 난 yyyy-MM-dd 형태가 필요하다. 그래서 Str단계에서 필요한 정보만 substring으로 조작하여 추려보자.

 

하지만

 		Date today_date = new java.util.Date();
		long today_long=today_date.getTime();
		String today_str=String.valueOf(today_long);
		System.out.println("today_date:"+today_date);
		System.out.println("today_long:"+today_long);
		System.out.println("today_str:"+today_str);
		
		Timestamp writingDate= getWritingList.get(0).getDate();
		long writingDate_long=writingDate.getTime();
		String writingDate_str= String.valueOf(writingDate_long);
		System.out.println("writingDate:"+writingDate);
		System.out.println("writingDate_long:"+writingDate_long);
		System.out.println("writingDate_str:"+writingDate_str);
today_date:Sat Feb 19 12:46:54 KST 2022
today_long:1645242414113
today_str:1645242414113
writingDate:2022-02-19 03:20:27.0
writingDate_long:1645208427000
writingDate_str:1645208427000

출력 값을 보니 date->long타입으로 변환때부터 문제가 있는거 같다.

 

그래서 Date->Str 변환법을 다시 알아보고

		DateFormat dateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");

		Date today_date = new java.util.Date();
		String today_str=dateFormat.format(today_date);
		System.out.println("today_date:"+today_date);
		System.out.println("today_str:"+today_str);
		
		Timestamp writingDate= getWritingList.get(0).getDate();
		String writingDate_str= dateFormat.format(writingDate);
		System.out.println("writingDate:"+writingDate);
		System.out.println("writingDate_str:"+writingDate_str);

출력해보니

today_date:Sat Feb 19 12:51:56 KST 2022
today_str:19/02/2022 12:51:56
writingDate:2022-02-19 03:20:27.0
writingDate_str:19/02/2022 03:20:27

원하는 값대로 출력이 됐다.

그럼 이걸 이용해서 중간 정리하자면

		Date today_date = new java.util.Date();
		DateFormat dateFormat_year = new SimpleDateFormat("yy/MM/dd");
		String today_str_year=dateFormat_year.format(today_date);

		model.addAttribute("today_str_year", today_str_year);

@Controller에서 

1. today_date로 오늘 날짜 받고

2. 출력 형태 지정

3.  String형태로 출력

4. JSP에 전송

 

<fmt:formatDate pattern="yy/MM/dd" value="${getWritingList.date}" var="date_year" /> 
<fmt:formatDate pattern="hh:mm:ss" value="${getWritingList.date}" var="date_hour" /> 
<fmt:parseDate pattern="yy/MM/dd" value="${today_str_year}" var="today_str_year1" />
<fmt:formatDate pattern="yy/MM/dd" value="${today_str_year1}" var="today_year" /> 
		<c:choose>
		<c:when test="${date_year == today_year}">
				<c:out value="${date_hour}" />
		</c:when>
		<c:otherwise>
			<c:out value="${date_year}" />
		</c:otherwise>
		</c:choose>

JSP에서

1. 게시글 정보가 담긴 MySQL board테이블 DB 속 TimeStamp형태의 글 작성날짜를 yy/mm/dd 형태로 저장

2. 게시글 정보가 담긴 MySQL board테이블 DB 속 TimeStamp형태의 글 작성날짜를 hh:mm:ss 형태로 저장
3. @Controller로 부터 받은 String 형태를 Date형태로 변경

    (이때 패턴 형태가 동일하지 않으면 Unparseable date 에러가 뜬다)

4. Date형태를 String형태로 변경해준다.

    [??그럼 방금 3번 4번은 할 필요가 없어 보여서 삭제를 해보니 잘 작동된다!]

 

5. 번 부턴 게시글 날짜가 오늘과 동일하면 시,분,초 만 출력 아니면 년,월,일만 출력하게끔 choose문 썼다.

 


출처: https://henerd.tistory.com/69 [코더의 흔적]

출처: https://chanchan-father.tistory.com/732 [찬찬이 아빠 블로그]

https://esckey.tistory.com/68

 
728x90

댓글