아래의 Date 객체들 중 invalid 한 객체는 몇 번 일까??
// 1번
new Date("2025-07-30")
// 2번
new Date("2025-07-32")
// 3번
new Date("2025-06-31")
.
.
.
정답은 2번 이었습니다. 하지만 달력을 살펴보면 2025년 6월 31일은 없는 날짜다.
Date 객체는 이를 invalid하게 처리하지 않는데, 이는 Date 객체가 날짜를 어느정도 보정해주기 때문이다.
Date 객체의 날짜 보정은 아래와 같이 시간을 더하거나 날짜를 더할 때에는 유용하다.
const date = new Date("2025-01-01")
date.setMonth(-1)
console.log(date.toString()) // "Sun Dec 01 2024 09:00:00 GMT+0900 (한국 표준시)"
2025년 1월 1일에서 1개월을 뺄 경우, date는 자동으로 2024년 12월 1일로 계산을 해준다.
만약 이러한 보정이 없었다면 개발자가 손수 예외처리를 해주어야 했을 것이다.
아래처럼 보정이 적용된 Date 객체와 검사하려는 문자열의 년,월,일을 비교하면 된다.
const isDateValid = (dateStr: string): boolean => {
const regex = /^\d{4}-\d{2}-\d{2}$/;
// 정규식 검사
if (!regex.test(dateStr)) return false;
const [year, month, day] = dateStr.split('-').map(Number);
// month가 invalid한 경우 early return
if (month < 1 || month > 12) return false;
// date는 1월을 0으로 계산하기 때문에 month-1로 계산
const constructedDate = new Date(year, month - 1, day);
// dateStr에서 표시하는 날짜와 date로 변환한 날짜가 같은 년,월,일을 표시하는지 검사
return (
constructedDate.getFullYear() === year &&
constructedDate.getMonth() === month - 1 &&
constructedDate.getDate() === day
);
};
이건 정말 중요한 개념이네요!
지금까지 당연하게 Date 객체는 'Date 객체' 인만큼!
기본벅인 날짜와 관련된 부분은 당연히 체크해 주는 줄 알았는데
뭔가 배신당한 느낌!? 이 들면서도,
한편으로는 날짜 계산을 쉽게하기 위해서라니..
그대신 그만큼 장점을 누리고 있었다는 느낌도 드네요!ㅎ
저 날짜 유효성 검사 함수는 반드시 알아두어야 할 것 같습니다!ㅎ
중요한 개념 하나 배우고 가네요! 감사합니다!