Moment.js 가 개발 중단을 선언했다.
Moment.js 라이브러리 사이트에 들어가보면 아래와 같은 이유로 다른 라이브러리 사용을 권장하고 있다.
대안으로 제안해준 라이브러리들은 다음과 같다.

2021년 7월 캘린더를 만들어보자!
startOfMonth, startOfWeek ,endOfMonth, endOfWeek를 사용해서 이번 달의 시작날짜와 끝 날짜를 알수 있다.
const selectedDate = new Date();
const startDate = startOfWeek(startOfMonth(selectedDate))
console.log(startDate)
const endDate = endOfWeek(endOfMonth(selectedDate))
console.log(endDate)
date를 주의 마지막 날 + 1일을 해주어 다음 주로 넘어갈 수 있다.
function takeWeek(start = new Date()) {
let date = startOfWeek(startOfDay(start))
return function () {
const week = [...Array(7)].map((_, index) => addDays(date, index))
date = addDays(week[6], 1)
return week
}
}
지금까지 저장한 month 배열의 마지막 날짜가 해당 달의 endDate보다 작다면 week 배열 가져와서 저장시킨다.
export function takeMonth(start = new Date()) {
let month = []
let date = start
return function () {
const weekGen = takeWeek(startOfMonth(date))
const endDate = startOfDay(endOfMonth(date))
month.push(weekGen())
while (lastDayOfRange(month) < endDate) {
month.push(weekGen())
}
const range = month
month = [];
date = addDays(lastDayOfRange(range), 1)
return range
}
}
function lastDayOfRange(range) {
return range[range.length - 1][6]
}

function WeekNames() {
const weeks =['일', '월', '화', '수', '목', '금', '토']
return (
<div className="grid grid-cols-7 text-xs text-gray-500">
{weeks.map((dayName)=>(
<div className="h-8 flex items-center justify-center border-r" key={dayName}>{dayName}</div>
))}
</div>
);
}
import {addMonths, format, subMonths} from 'date-fns'
function Calendar() {
const [currentDate, setCurrentDate] = useState(new Date());
const [selectedDate, setSelectedDate] = useState(new Date())
const data = takeMonth(currentDate)()
const nextMonth = () => {
setCurrentDate(addMonths(currentDate, 1));
};
const prevMonth = () => {
setCurrentDate(subMonths(currentDate, 1));
};
return (
<div className="box-border m-8 w-2/3">
<div className="flex items-center">
<h1 className="text-xl font-bold">{format(currentDate, 'MMMM yyyy')}</h1>
<MdKeyboardArrowLeft onClick={prevMonth} size={20}/>
<MdKeyboardArrowRight onClick={nextMonth} size={20}/>
</div>
<div className="border">
<WeekNames/>
{data.map((week, index) => <div className="grid grid-cols-7" key={index}>
{week.map((day) =>
<div onClick={() => setSelectedDate(day)}
className={`h-28 flex flex-col items-center border-b border-r`}
key={day}>
<div className={`flex text-xs font-bold ${dayColor(day, currentDate)} h-6 w-6 justify-center items-center cursor-pointer`}> {format(day, 'dd')}</div>
</div>)}
</div>)}
</div>
</div>
);
}
format을 사용해서 원하는 포맷으로 날짜를 설정할 수 있다!