자바스크립트에서 날짜 관련 핸들링은 항상 어렵다.

 

월단위로 데이터를 검색하는 경우 검색 조건 통제를 위한 자바스크립트로 월단위를 더하는 방식을 알아본다.

 

// 한자리면 0붙이기

function pad(n) {

    return n < 10 ? '0'+n : ''+n

}

// 월 더하기
function addMonth(d, n) {
    d.setMonth(d.getMonth() + n);
    return d.getFullYear() + '/' + pad(d.getMonth()+1) + '/' + pad(d.getDate());    
}

// 실행

console.log(addMonth(new Date('2022/01/01'), 1)); // '2022/02/01'

console.log(addMonth(new Date('2022/01/15'), 1)); // '2022/02/15'

console.log(addMonth(new Date('2022/01/31'), 1)); // '2022/03/03' ??????????????

 

이는 자바스크립트에서 setMonth 함수로 월을 셋팅하면 일은 그대로고 월만 변경 되기 때문에

2022/02/31 이 된다. 2월은 28일 까지 있으므로 자바스크립트 자체에서 2월28일에서 3일을 더해 3월3일이 되는 것이다.

이에 대한 예외 처리를 해줘야 한다.

// 1자리면 0 붙이기

function pad(n) {
    return n < 10 ? '0'+n : ''+n
}

// 윤년인지여부
function isLeapYear(year) {
    return (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)); 
}

// 해당년월의 말일 구하기
function getLastDate(year, month) {
    return [31, (isLeapYear(year) ? 29 : 28), 31, 30, 31, 30, 31, 31, 30, 31, 30, 31][month];
}

// 월 더하기
function addMonth(d, n) {
    var date = d.getDate();
    d.setDate(1); // 1일로 설정
    d.setMonth(d.getMonth() + n); // 개월수 더하기
    //d.setDate(d.getDate() - 1); 
    return d.getFullYear() + '/' + pad(d.getMonth()+1) + '/' + pad(Math.min(date, getLastDate(d.getYear(), d.getMonth())));    
}
// 실행
console.log(addMonth(new Date('2022/01/01'), 1)); // '2022/02/01'
console.log(addMonth(new Date('2022/01/15'), 1)); // '2022/02/15'

console.log(addMonth(new Date('2022/01/31'), 1)); // '2022/02/28'

제대로 나오는거 같다.

+ Recent posts