반응형
자바스크립트 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일이 잘 출력된다.
반응형
'언어 > Javascript, Typescript' 카테고리의 다른 글
[js] 객체안에 함수넣기 (0) | 2023.03.27 |
---|---|
[js] Dayjs 라이브러리 (설치방법, i18n, 객체생성, get(), set(), DateFormat 설정 등) (0) | 2023.03.24 |
[js] 콜백지옥 코드 수정 (0) | 2023.03.23 |
[js] try...catch, finally 정리 (0) | 2023.03.23 |
[js] async & await 정리 (0) | 2023.03.22 |
댓글