new Date() 함수로 시간 연산
n시간전 구현하기
들어가며😃
카드 컴포넌트 아래에 원래는 날짜형식으로만 표시되었다. 사실 프론트에서 날짜를 정리하지않고 백단으로 부터 정리된 날짜형식 (2023-06-15)으로 받아서 그대로 사용했었다. 하지만 최근 게시물에는 시간을 보여주는게 좋을 것 같아 현재시간과 비교하여 24시간 이전에 등록된 게시물이면 등록된 시간을 n시간 전으로 표시될 수 있도록 로직을 추가 하였다.
위와 같이 24시간 이전에 등록된 게시글이면 n시간 전이라는 문구(좌)를, 24시간이 지나면 날짜(우) 로 대체할 것이다.
그리고 위를 구현하기 위해 나는 함수 2개를 사용하였다.
- yyyy-mm-dd 형식을 만드는 date 함수
- 1번의 date함수와 현재 시간을 비교하는 함수
yyyy-mm-dd 형식 만들기
우선 백에서 받는 시간형식은 위와 같았다. 이 시간 데이터를 인자로 받아 가공해보자
export const transformDate = (dateString: string) => {
const date = new Date(dateString);
const year = date.getFullYear();
const month = ("0" + (1 + date.getMonth())).slice(-2);
const day = ("0" + date.getDate()).slice(-2);
return [year, month, day].join("-"); // 기대값 : 2023-06-15
};
-
우선 받은 데이터를 프론트에서 조작할 수 있도록
new Date()
내장함수를 이용하여 변형한다. 그럼 위의 이미지에서 보였던 날짜 데이터가Wed Jun 14 2023 20:49:04 GMT+0900 (한국 표준시)
와 같이 변경된다. -
getFullYear()
를 통해 년도를 구한다. -
getMonth()
를 이용하면 해당 월 보다 하나가 작게 나온다. 그래서 1을 추가해줘야한다.
그리고 1~9월에는 앞에 0을 붙여주어, 예를 들어 06월로 표시될 수 있도록 해준다. 이렇게 되면 10~12월에도 똑같이 0이 붙으니slice(-2)
를 통해 뒤에서 부터 2글자를 잘라주는 것이다. -
날짜 형식도 위의 월 구하는 형식과 같고 1 추가 해주는 로직만 없다.
-
그리고
join("-")
을 통해 최종적으로 yyyy-mm-dd 형식으로 리턴!
현재시간과 비교하여 n시간 전 구하기
아래는 위에서 작성한 transformDate() 함수를 불러와 현재 시간과 비교하는 함수이다. 카드 컴포넌트에서는 아래의 함수만 사용되었다.
export const getBoardDate = (dateString: string) => {
const date = transformDate(dateString);
const currentTime = new Date();
const targetTime = new Date(dateString);
const timeDifference = Number(currentTime) - Number(targetTime);
const hoursDifference = Math.floor(timeDifference / (1000 * 60 * 60));
if (hoursDifference < 1) {
return "방금 전";
} else if (hoursDifference < 24) {
return `${hoursDifference}시간 전`;
} else {
return date;
}
-
transformDate()
함수로 부터 yyyy-mm-dd 형식의 가공된 데이터를 불러온다.(시간 비교와는 별개) -
new Date()
로 현재 시간을 불러온다. -
시간을 비교하기 위해 인자로 받은 시간 데이터를
new Date(dateString)
으로 변환해준다. -
2.3번의 시간을 비교한다.
Number(currentTime or targetTime)
으로 로그를 찍어보면 음 꽤나 심오한 숫자가 나올텐데, 해당 값은 1970년 1월 1일 00:00:00 UTC를 기준으로 현재까지의 경과 시간을 밀리초 단위로 나타낸 것이라고 한다. 어쨋던 기준점이 되는 시간이 있고 그 시간차를 각각 구한 후, 둘의 시간차를 연산한 것이 4번 과정이다. -
4번은 밀리초 단위로 값을 주기에 우리가 원하는 시간으로 변환해주어야한다.
1000은 1초를 밀리초 단위로, 60은 1분을 초 단위로, 60은 1시간을 분 단위로 나타낸다. 따라서,1000*60*60
은 1시간을 밀리초 단위로 나타내는 값이 되는 것이다. -
5번에서 구해진 시간차가 24시간 이하라면 n시간전을, 1시간 전 이라면 ‘방금 전’을, 24시간 이상이라면 1번에서 가져온 date를 리턴해준다.
이렇게 간단하게 시간을 변환하는 함수를 정리해보았다. 사실 시간 함수는 너무 흔하고 잘 알려주는 글이 많아 어렵지않다. 그런데 이번에 내가 글을 쓰고 정리해보니 로직에 대한 이해가 훨씬 높아졌다. 특히 n시간전을 구하는 로직은 처음 적용해보면서 시간단위의 변환 로직에 대해 더 잘 알게되었고 컴포넌트의 UI에 대한 접근도 향상된 것 같아 뿌듯하다. 오늘도 1뿌듯 완😎