[FE] 현재로부터 경과한 시간 표시하기 (시간차이 크기에 따라 단위 바꾸기)

yoondgu·2022년 8월 14일
0

기능 구현

목록 보기
2/4

model로부터 전달받은 리뷰게시글 list를 jsp에 jstl과 el을 통해 출력하는데
게시글의 '작성일'정보는 알고 있지만 이를 경과시간으로 바꿔 표현하고자 했다.

날짜를 다루는 데 편리한 moment.js 라이브러리에서 제공하는 diff 메소드와 duration 객체를 사용했다.

  • diff 메소드로 시간 차이 구하기
    시간 정보를 가지고 있는 두 moment 객체 a, b에 대하여
    a.diff(b) 와 같이 작성하면 두 시간 차이를 milliseconds 단위로 반환받을 수 있다.
    또는 a.diff(b, 'days') 와 같이 계산 단위를 명시할 수도 있다. ('days' : 일 단위로 반환)

  • 나 같은 경우
    1년 이상의 경과시간을 가지면 n년전, 1개월 이상의 경과시간을 가지면 n개월 전, ...
    이렇게 경과시간의 값에 따라 단위를 다르게 표현하고자 했다.

duration 객체는 시간 정보를 통해 생성하고, 이 시간정보에 대해 다른 단위로 반환해준다.
기본적으로는
moment.duration(milliseconds 단위의 시간 값);
위와 같이 생성하고, moment.duration(2, 'seconds');와 같이 원하는 시간 단위를 명시해줄 수 있다. (2초에 해당하는 시간 값을 가지게 됨)
또 해당 객체에 asYears(), asMonths(), asWeeks()...와 같은 메소드를 호출해서 그 단위로 변환된 값을 반환받을 수 있다.

따라서 diff메소드로 구한 시간 차이를 사용해 duration 객체를 획득하고,
시간 차이의 값에 따라 적절한 단위로 변환시켜 값을 돌려받도록 했다.

중복된 코드를 줄이기 위해, 각 시간 단위 별 값들을 배열로 만든 뒤 반복문으로 검사하였다.

 	// elapsedTime 클래스를 가지는 모든 태그에 획득한 경과시간을 출력
	 $(".elapsedTime").each(function() {
		 let elapsedTime = getElapsedTime($(this).attr("data-created-date"));
		 $(this).text(elapsedTime);
	 });
	 // 작성일에 대한 문자열을 전달하면 경과시간을 적절한 단위로 반환하는 함수
	 function getElapsedTime(createdDateString) {
		let now = moment();
		let createdDate = moment(createdDateString, 'YYYY-MM-DD HH:mm:ss');
		// 경과시간 정보
		let duration = moment.duration(now.diff(createdDate));
		// 경과시간에 대해 문자열로 표시할 단위 옵션
		let durationOptions = [
			{"dur" : duration.asYears(), "option" : "년 전"},
			{"dur" : duration.asMonths(), "option" : "개월 전"},
			{"dur" : duration.asWeeks(), "option" : "주 전"},
			{"dur" : duration.asDays(), "option" : "일 전"},
			{"dur" : duration.asHours(), "option" : "시간 전"},
			{"dur" : duration.asMinutes(), "option" : "분 전"},];
		
		// 반복문으로 duration의 값을 확인해 어떤 단위로 반환할지 결정한다.
		// ex) 0.8년전이면 "8개월 전" 반환
		for (let durOption of durationOptions) {
			if (durOption.dur >= 1) {
				return Math.round(durOption.dur) + durOption.option;
			}
		}
		// 분 단위로 검사해도 1 이상이 아니면(반복문에서 함수가 종료되지 않으면) "방금 전" 반환
		return "방금 전"
	}


위와 같이 언제나 '현재 시점'으로부터 경과시간을 표시해주는 것을 확인할 수 있다.

0개의 댓글