소록
780
2019-09-15 14:25:33 작성 2019-09-15 14:46:02 수정됨
9
337

몇달전,몇년전 시간표시 미치겠네요ㅠㅠㅠㅠ


자바 스프링으로 jsp 화면단에 디비로부터 date객체 시간을 가져와


몇달전 게시글, 몇주전 게시글 이렇게 표시하고 싶은데..도무지 해결이 안되네요ㅠㅠ


timeBefore함수 인자에 :  'Thu Jun 20 2017 15:01:17 GMT+0900' 이러한 문자열로 넣어주면 계산이 잘되는데


디비로부터 데이트 값 '${board.regDate}' 을 가져와서 이렇게 넣어주면

'${board.regDate}'  >>  Sat Sep 14 22:39:48 KST 2019' 이러한 형식으로 인자가 전달되면서

날짜 계산이 안되네요..


확실하게 GMT+0900이라는 형식으로 넣어주면 되고  KST 라는 형식으로 넣어주면 계산이 안되는데ㅠㅠ

미치겠네요 몇시간째 헤매는데 도와주세요ㅠㅠ디비로부터 데이트 값을 가져와서 형식을 변환해야하는건지..

<script>

function timeBefore(time){ 

        //현재시간을 가져옴

        var now = new Date();  

        //글쓴 시간 

        var writeDay = new Date(time);

      var minus;

        //현재 년도랑 글쓴시간의 년도 비교 

        

        if(now.getFullYear() > writeDay.getFullYear()){

            minus= now.getFullYear()-writeDay.getFullYear();

            //두개의 차이를 구해서 표시

            return minus+"년 전";

        }else if(now.getMonth() > writeDay.getMonth()){

        //년도가 같을 경우 달을 비교해서 출력

            minus= now.getMonth()-writeDay.getMonth();

            return minus+"달 전";

        }else if(now.getDate() > writeDay.getDate()){

        //같은 달일 경우 일을 계산

            minus= now.getDate()-writeDay.getDate();

            return minus+"일 전";

        }else if(now.getDate() == writeDay.getDate()){

        //당일인 경우에는 

            var nowTime = now.getTime();

            var writeTime = writeDay.getTime();

            

            if(nowTime > writeTime){

            //시간을 비교

                sec =parseInt(nowTime - writeTime) / 1000;

                day  = parseInt(sec/60/60/24);

                sec = (sec - (day * 60 * 60 * 24));

                hour = parseInt(sec/60/60);

                sec = (sec - (hour*60*60));

                min = parseInt(sec/60);

                sec = parseInt(sec-(min*60));

                if(hour > 0){ 

                //몇시간전인지

                    return hour+"시간 전";

                }else if(min > 0){

                //몇분전인지

                    return min+"분 전";

                }else if(sec > 0){

                //몇초전인지 계산

                    return sec+"초 전";

                }

            }

        }else{

        return "시간계산오류";

        }

     }

 

var times = '${board.regDate}';

document.write(timeBefore(times));

</script>

0
0
  • 답변 9

  • moonti
    2k
    2019-09-15 14:47:57 작성 2019-09-15 14:48:34 수정됨
    저렇게하면 2019년 12월 31일하고 2020년 1월1일하고 1년전이 될텐데요 
    0
  • 소록
    780
    2019-09-15 14:53:15

    moonti  사실 그것도 문제지만 가장 큰 문제가 ㅠㅠ 함수밖에서 들어가는 매개변수 인자에 먼저 문제가 있어서요ㅠ new data(인자)  이 데이트에 들어가는 인자 자체가 형식이 맞지를 않는거같아요ㅠ

    0
  • moonti
    2k
    2019-09-15 16:52:03

    해보니까 KST를 빼면 new Date('Sat Sep 14 22:39:48 2019') 정상적으로 날짜 파싱해요.
    현재 설정된 타임존에 따라 알아서 GMT+0900 하는 거같은데요. 
    https://meetup.toast.com/posts/125


    참고하셔서 적절하게 변경해주면 되곘네요.

    0
  • TeraGo
    200
    2019-09-15 17:22:46
    <?php
    // 날짜 계산 함수
    function passing_time($datetime) {
    	$time_lag = time() - strtotime($datetime);
    	
    	if($time_lag < 60) {
    		$posting_time = "방금";
    	} elseif($time_lag >= 60 and $time_lag < 3600) {
    		$posting_time = floor($time_lag/60)."분 전";
    	} elseif($time_lag >= 3600 and $time_lag < 86400) {
    		$posting_time = floor($time_lag/3600)."시간 전";
    	} elseif($time_lag >= 86400 and $time_lag < 2419200) {
    		$posting_time = floor($time_lag/86400)."일 전";
    	} else {
    		$posting_time = date("y-m-d", strtotime($datetime));
    	} 
    	
    	return $posting_time;
    }
    ?>
    해당 코드는 PHP 코드인데 해당 코드 참고해보시고 변형해보세요 !
    출처 - https://sir.kr/g5_tip/1981
    0
  • 소록
    780
    2019-09-15 19:28:33

    TeraGo  계산함수는 문제가 없어요  저 계산함수 인자로 들어가는 타입때문에 그래요

    0
  • 소록
    780
    2019-09-15 19:32:46 작성 2019-09-15 19:44:47 수정됨

    moonti Sat Sep 14 22:39:48 KST 2019' 이 부분에서 kst만 빼주는 파싱 메소드가있나요?..저싸이트가보았는데 kst만 빼주는 메소드는 없는거같은데 ..이미 new date 타입의 인자로 들어가지가 않아서요

    타입의 인자로 들어가기전에 kst를 빼줘야하는거같은데

    0
  • moonti
    2k
    2019-09-15 20:04:47

    자바코드로 빼시거나 스프링에서 빼서 넣어주시면 대죠. 저 사이트는 변환시 시간 조정 참고차 드린거애요

    0
  • 소록
    780
    2019-09-15 20:15:07

    moonti  아하 감사합니다 역시 그방법밖엔없나보군요ㅠㅠ감사합니다

    0
  • yeori
    686
    2019-09-15 23:33:07

    기본 단위를 초단위로 해서 시간차를 구한 후에 이 차이값을(초)에서

    년-월-일-시-분-초

    ...로 단위 변환을 하면 구현이 쉽습니다.

    예를 들어 시간차가 104 초이면 1분 44초일테니 가장 큰 단위값인만 반환합니다

    시간차가 3756초이면 

    1시간 2분 36초인데 가장 큰 1(시간)만 반환합니다

    시간의 단위를 배열로 준비하고

    [60초, 60분, 24시간, 30일, 365일]

    시간차값을 계속해서 나눠줍니다. 0보다 클동안....

    뒤에 붙는 단위명까지 우아하게 처리하려면 아래와같이 자료구조를 정의하면 좋겠네요

    const tunits = [
      {unit:60, uname:'초전'}, 
      {unit:60, uname:'분전'}, 
      {unit:24, uname:'시간전'}, 
      {unit:30, uname:'일전'}, 
      {unit:12, uname:'달전'}, 
      {unit:100000000, uname:'년전'} //겁나 큰 값을 줌
    ]



    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.