함수 정의:
formatTimestamp 함수는 주어진 ISO 형식의 타임스탬프를 현재 시각과 비교하여, 상대적인 시간 경과를 한국어로 포맷팅하여 반환하는 유틸리티 함수입니다.
입력:
ISO 형식의 타임스탬프 문자열 (예: "2024-06-23T12:00:00Z")
출력:
상대적인 시간 경과를 한국어로 포맷팅한 문자열
1분 미만: "30초 전"
60분 미만: "5분 전"
24시간 미만: "2시간 전"
7일 미만: "3일 전"
일주일 이상 지난 경우: "2024-06-16 09:00"
동작 방식:
현재 시간과 입력된 타임스탬프를 비교합니다.
초, 분, 시간, 일 단위로 경과 시간을 계산합니다.
경과 시간에 따라 적절한 포맷으로 문자열을 반환합니다.
export const formatTimestamp = (timestamp) => {
// 비교할 현재 시간을 가진 상수를 만든다.
const dateNow = new Date();
// 가져온 timestamp를 new Date에 넣으면 영국 시간으로 바뀌기 때문에, 9시간을 뺀 값을 새로 new Date를 통해 가져온다.
const offset = 1000 * 60 * 60 * 9;
const dateComment = new Date(new Date(timestamp).getTime() - offset);
// 두 시간의 차이를 초, 분, 시, 일까지 계산한다.
const mscDiff = dateNow.getTime() - dateComment.getTime();
const secDiff = mscDiff / 1000;
const minDiff = secDiff / 60;
const hrsDiff = minDiff / 60;
const dayDiff = hrsDiff / 24;
if (secDiff < 60) {
// 60초보다 작을 경우 1분 미만이기에 소수점 이하를 버린 해당 초를 반환한다.
return `${Math.floor(secDiff)}초 전`;
} else if (minDiff < 60) {
// 60분보다 작을 경우 해당 분을 반환한다.
return `${Math.floor(minDiff)}분 전`;
} else if (hrsDiff < 24) {
// 24시간보다 작을 경우 해당 시간을 반환한다.
return `${Math.floor(hrsDiff)}시간 전`;
} else if (dayDiff < 7) {
// 7일보다 작을 경우 해당 일을 반환한다.
return `${Math.floor(dayDiff)}일 전`;
} else {
// 위 조건이 모두 아닐 경우 일주일 이상 지났기에, 해당 날짜를 반환한다. 이 때 조건에 따라 적절히 문자열을 변경한다.
return timestamp.replace("T", " ").slice(0, 16);
}
};
시간대를 비교하는 문제라 조금 어려움을 겪었다. 풀고 나면 로직 자체는 정말 간단하지만, 두 시간을 비교하는 로직을 제작하는 것 자체가 좀 어려웠던 것 같다. new Date를 적극 활용해야겠다.
가장 자기 객관화가 안되는 부분.
(신입에겐 좀 어려울 수 있음, 조직 내 짬이 차야함)
아주 쉬운 것
앞으로 이런 능력들을 갖는데 노력을 하면 굉장히 좋을 것이다.
타입스크립트에 대한 이해도가 부족했지만 오늘 11시의 특강 및 쿡북을 통해 리액트에서 타입스크립트를 사용하는 방법에 대해서 감을 약간이라도 잡은 날이었다. 덕분에 과제를 어느 정도까지는 진행시킬 수 있었고, 타입스크립트에 대한 완벽한 이해를 하기보다는(어차피 이 짧은 시간 내에 못 한다) 과제를 진행하면서 점차 공부해나가는 방식으로 해야할 것 같다!
우와 솔님 정리 무엇 !!