본문 바로가기
언어/Javascript, Typescript

[js] 자바스크립트 Date객체 (기간 조회 및 날짜 계산)

by minhyeok.lee 2023. 3. 24.
반응형

자바스크립트 Date객체 (기간 조회 및 날짜 계산)

자바스크립트 Date 객체

기본적으로 자바스크립트의 Date 객체는 setMonth(), setDate()를 이용하여 날짜를 직접 지정할 수 있는 기능을 제공하고, setMonth(월 + N) 과 같은 기능을 통해 날짜 계산이 가능하다.

 

예)

// 직접 날짜를 지정하는 방식
let birthday = new Date('February 2, 1997 03:24:00')
let birthday = new Date('1997-02-2T03:24:00')
let birthday = new Date(1997, 1, 2)            // 월은 0부터 시작
let birthday = new Date(1997, 1, 2, 3, 24, 0)


// Date의 연도에 0부터 99까지의 정수를 제공하면 1900부터 1999로 처리한다.
let date = new Date(98, 1)  // Sun Feb 01 1998 00:00:00 GMT+0900 (대한민국 표준시)

// 구형 메서드: 여기서도 98을 1998로 처리
date.setYear(98)            // Sun Feb 01 1998 00:00:00 GMT+0900 (대한민국 표준시)

// 1900년대가 아닌, 실제 0 ~ 99년을 지정해야 하면 
// Date.prototype.setFullYear(), Date.prototype.getFullYear() 메서드를 사용해야 한다.
date.setFullYear(98)        // Sat Feb 01 0098 00:00:00 GMT+0827 (대한민국 표준시)

 

자바스크립트 날짜 계산 시 주의할 점

1. today.getMonth() + 1을 해야 제대로 된 월이 나온다.  왜냐하면 getMonth()의 리턴값은 0부터 11까지이기때문이다. 따라서 getMonth() 메소드를 사용한다면 +1을 해줘야 원하는 결과값이 나온다.

 

let today = new Date()			      // 오늘 날짜
let newDay = new Date(today)		    // 새로운 날짜

newDay.setDate(today.getDate() + 3)	  // 새로운 날짜 = 오늘에서 3일 더하기
newDay.setMonth(today.getMonth() - 2)	// 새로운 날짜 = 오늘에서 두 달 전으로 변경하기
newDay.setFullYear(newDay.getFullYear() - 1) // 새로운 날짜 = 오늘에서 일년 전으로 변경하기

2. 위 코드 예제와 같은 계산 시 getDate()를 제외하고 Month가 변경된다면 날짜가 30, 31, 28일인지를 전혀 고려하지 않고 정확하게 월/년 만 변경하기때문에 문제가 생긴다.

 

예)

8월 31일의 한 달 전은 7월 31일로 문제가 없다.

2달 전은 6월 30일이 아니라 7월 1일이 나온다.

8월 31일의 두 달 전은 6월 31일이고, 6월 31일은 없기 때문에 하루 넘어가 7월 1일로 계산된다.

3월 31일의 한 달 전도 2월 28일이 아니라 2월 31일, 즉 3월 3일이다.

 

기존 날짜와 새로운 날짜의 일자가 다르면 새로운 날짜의 계산이 잘못되었고 판단하여 해당 달의 마지막 날이 출력되도록 수정한다.

 

코드 예제)

const dateFormatter = function(newDay, today) {
  let year = newDay.getFullYear()
  let month = newDay.getMonth() + 1
  let date = newDay.getDate()

  // 기존 날짜와 새로운 일자가 다를 경우 
  if (today) {
    let todayDate = today.getDate()

    if (date != todayDate) {
      if (month == 0) year -= 1
      month = (month + 11) % 12
      date = new Date(year, month, 0).getDate()	// 해당 달의 마지막 일자를 반환
    }
  }
  month = ("0" + month).slice(-2)
  date = ("0" + date).slice(-2)

  return year + "-" + month + "-" + date
}

console.log(dateFormatter(newday, today))

날짜 포맷("yyyy-MM-dd") 형식으로 반환하고 위 예제 처럼 8월 31일의 2달전이 6월 30일 3월 31일의 한 달전도 2월 28일이 잘 출력된다.

반응형

댓글