토이 프로젝트로 유기 동물 공고 관련 웹 페이지를 만들면서,
이 부분의 n일 전 로직을 구현하기 위해 날짜 계산 라이브러리를 사용하였다.
처음에는 코드가 간편하고 관련 문서가 찾기 쉽다는 이유로 Moment.js를 사용하였는데
왜 Day.js 대신 사용을 지양하는 Moment.js를 사용하셨나요?
라는 피드백을 받았다.
지금까지 잘 써왔던 Moment.js가 레거시한 코드가 되었다니...?
Day.js로 코드를 마이그레이션 하면서 그 이유를 찾아보게 되었다.
import moment from 'moment'
import 'moment/locale/ko' // 대한민국 로컬 시간
const getPeriod = (date: string, type: string) => moment(date, type).fromNow()
export default getPeriod
Webpack
그리고, Moment.js
👩🏫 사용되지 않는 기능 때문에 네트워크 코스트와 페이지 렌더링 시간이 증가하고, 다운로드 속도는 저하되는 거죠!
사이즈가 매우 작다.
dayjs/plugin
를 통해 확장하여 사용할 수 있다.Moment.js와 사용 방법이 유사하다.
If you use Moment.js, you already know how to use Day.js.
I18n
npm install dayjs
yarn add dayjs
Day.js is immutable!
Moment.js와 달리 변경이 불가능(immutable)하기 때문에 이미 변수에 Day.js 객체의 날짜를 메소드로 변경할 경우 변수에 재할당해주어야 한다.
// Moment.js
const dateWithMoment = moment('2023-11-02');
dateWithMoment.add(7, 'day'); // 1일 추가
console.log(dateWithMoment.formet('YYYY-MM-DD'); // '2023-11-09'
// Day.js
let dateWithDay = dayjs('2023-11-02');
dateWithDay.add(1, 'day') // 1일 추가
console.log(dateWithDay.format('YYYY-MM-DD')) // '2023-11-02' 그대로 출력
dateWithDay = dateWithDay.add(1, 'day') // 1일 추가 + 재할당
console.log(dateWithDay.format('YYYY-MM-DD')) // '2023-11-09'
날짜 표시하기
import dayjs from 'dayjs'
const date = dayjs('2023-11-02T23:56:00+09:00')
console.log(date.year()) // 2023 (연도)
console.log(date.month()) // 11 (월)
console.log(date.date()) // 02 (일)
console.log(date.hour()) // 23 (시)
console.log(date.minute()) // 56 (분)
console.log(date.second()) // 0 (초)
console.log(date.format('YYYY.MM.DD (HH:mm)')) // '2023.11.02 (23:56)'
날짜 변경하기
let date = dayjs('2023-11-02T23:56:00+09:00')
date = date
.set('month', 12) // 12월로 달 변경
console.log(date.format('YYYY년 MM월 DD일')) // '2023년 12월 02일'
let date = dayjs('2023-11-02T23:56:00+09:00')
date = date
.add('day', 12) // 12일 더하기
console.log(date.format('YYYY년 MM월 DD일')) // '2023년 11월 14일'
let date = dayjs('2023-11-02T23:56:00+09:00')
date = date
.subtract('month', 6) // 6개월 빼기
console.log(date.format('YYYY년 MM월 DD일')) // '2023년 05월 02일'
I18n (국제화)
import dayjs from 'dayjs'
import 'dayjs/locale/ko'
dayjs.locale('ko') // global로 한국어 locale 사용
const todayKor = dayjs('2023-11-02')
console.log(todayKor.format('ddd')) // '목요일'
const todayEng = dayjs('2023-11-02').locale('en')
// todayEng 인스턴스에서만 영어 locale사용
console.log(date2.format('ddd')) // 'Thu'
import dayjs from 'dayjs'
import duration from 'dayjs/plugin/duration'
dayjs.extend(duration)
export const getDiff = (date: string) => {
const today = dayjs()
const diff = dayjs.duration(today.diff(date))
const yearDif: number = parseInt(diff.format('Y'))
const monthDif: number = parseInt(diff.format('M'))
const dateDif: number = parseInt(diff.format('D'))
if (yearDif > 0) {
return `${yearDif}년`
} else if (monthDif > 0) {
return `${monthDif}달`
} else if (dateDif > 0) {
return `${dateDif}일`
} else {
return '하루'
}
}
작성하신 글 잘 봤습니다.!! 혹시 변수명을 더 이해하기 쉽도록 해주실려구 dateWithDay dayjsDated 이런식으로 구별해서 작성해 주신걸까요? 그리고 현재 날짜 선언 부분에서 재할당 관련 처리가 살짝 어려워보이는데 제가 이해한게 맞나 궁금해서 여쭤봅니다!!!!!