(js) JavaScript 날짜 객체(기간 검색 및 날짜 계산)

자바스크립트 날짜 객체 (기간검색 및 일자계산)

1. 자바스크립트 날짜 객체

기본적으로 JavaScript Date 객체는 setMonth() 및 setDate()를 사용하여 직접 날짜를 지정하는 기능을 제공하며 setMonth(Month + 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 (대한민국 표준시)

JavaScript에서 날짜를 계산할 때 고려해야 할 사항

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. 위 코드 샘플과 같이 계산할 때 날짜가 30일인지, 31일인지, 28일인지를 고려하지 않고 월/년만 변경하기 때문에 getDate()를 제외하고 월을 변경할 때 문제가 있습니다.

예)

8월 31일 한 달 전이 7월 31일이니 문제 없습니다.

두 달 전에는 6월 30일이 아니라 7월 1일이었습니다.

8월 31일의 두 달 전은 6월 31일이며, 6월 31일이 없기 때문에 하루 앞선 7월 1일을 계산합니다.

3월 31일 한 달 전은 2월 28일이 아니라 3월 3일인 2월 31일입니다.

이전 날짜와 새 날짜의 날짜가 다르면 새 날짜의 계산이 잘못되며, 해당 월의 마지막 날을 표시하도록 변경합니다.

코드 예)

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일, 한 달 전 6월 30일, 3월 31일, 2월 28일을 잘 인쇄합니다.