개발
자바스크립트에서 n시간 전, n일 전 구현 방법
아래 방법은 다국어를 지원하고 Next.js에서의 구현 방법이다. 리액트도 사용 가능하다.
GitHub - sooros5132/notion-blog-kit: A statically generated blog using Next.js, Notion Api.
A statically generated blog using Next.js, Notion Api. - sooros5132/notion-blog-kit
https://github.com/sooros5132/notion-blog-kit
위 저장소에 적용했던 것을 공유하고자 작성.
구현
typescript
서버에서 빌드중인 경우엔 언어를 모르다 보니 Intl.DateTimeFormat을 이용해 MM/dd/yyyy같은 형식의 날짜를 보여주고
hydrate가 되었을 때 브라우저의 language 값을 가져와서 Intl.RelativeTimeFormat으로 1일 전, 1주일 전으로 바꿔준다. 브라우저의 navigator값을 읽다 보니 자동으로 다국어 지원이 된다.
span에 suppressHydrationWarning 이건 hydrate 중에 경고를 표시하기 때문이다.
공통 컴포넌트 (예시: <div>) – React
The library for web and native user interfaces
https://ko.react.dev/reference/react-dom/components/common#common-props
• suppressHydrationWarning: 불리언 타입입니다. 서버 렌더링을 사용할 때, 일반적으로 서버와 클라이언트가 서로 다른 콘텐츠를 렌더링하면 경고가 표시됩니다. 일부 드문 사례(예시: 타임스탬프)에서는 정확한 일치를 보장하기가 매우 어렵거나 불가능합니다. suppressHydrationWarning를 true로 설정하면, React는 해당 엘리먼트의 어트리뷰트와 콘텐츠가 일치하지 않아도 경고를 표시하지 않습니다. 이는 한 단계의 깊이에서만 작동하며, 탈출구로 사용하기 위한 것입니다. 과도하게 사용하지 마세요. suppressing hydration 오류에 대해서 읽어보세요.
테스트 결과
2023-11-08 22:52:00 기준으로 계산되었다.
numeric 부분이 always인 경우는 아래처럼 출력된다.
plain text
numeric 부분이 auto인 경우는 아래처럼 출력된다.
plain text
다국어가 잘 되는지 위치를 도쿄로 바꿔보자
모두 다 잘 된다.
null이 53년 전으로 나오는 이유는 new Date(null)을 해보면 Thu Jan 01 1970 09:00:00 GMT+0900 (한국 표준시)으로 나오게 돼서 그렇다.
실제로 사용할 땐 hover때나 자세히 보기 같은 곳에선 n일전이 아니라 MM/dd/yyyy형식의 날짜를 보여주면 UX적으로 좋으니 디테일을 챙기자.
아래는 예시로 유튜브의 영상 정보 부분을 가져왔다.