날짜와 시간을 저장하고 보여줄 때, 날짜객체를 활용한다.
날짜객체를 활용하면, 쉽게 날짜와 시간을 얻을 수 있는데, 다음과 같은 형태로 날짜객체를 생성할 수 있다.
var rightNow = new Date();
date 객체를 통해 날짜와 시간을 가져온 뒤, date 객체가 가지고 있는 함수로 각 날짜 & 시간의 값을 가져올 수 있다.
let year = rightNow.getFullYear();
let month = rightNow.getMonth()+1;
let date = rightNow.getDate();
let day = rightNow.getDay();
let currentHour = rightNow.getHours();
let currentMin = rightNow.getMinutes();
let time = rightNow.getTime();
단, month값을 가져올 때는 현재 월보다 하나 작은 월이 호출되므로 주의해야한다. 또한 getDay()
는 요일을 반환하는 메소드로, 0은 일요일을 나타낸다. (6은 토요일)
getTime()
메소드는 기준이 되는 1970년 1월 1일부터 현재날짜까지의 밀리초 표현을 반환한다. new Date()
가 재호출되어 값이 변동된다면 getTime()
로 반환하는 밀리초 값도 변화하며, 해당 값의 비교연산을 통해 언제가 더 과거인지 알아낼 수 있다. (더 작을수록 과거)
new Date()
에 특정 날짜를 매개변수로 넘겨주면, 해당 날짜의 date를 반환받을 수 있다.
만으로 계산한 나이를 구하는 함수인 getWesternAge 함수를 구현해 봅시다.
만으로 계산한 나이가 한국 나이와 같을 때 & 그렇지 않을 때의 경우의 수를 적어놓지 않으니 너무 헷갈려서, 그 내용부터 텍스트로 적어보았다.
현재 년도 - 태어난 년도 = 만 나이인 경우,
1. 태어난 월 & 일이 지금과 같은 경우
2. 태어난 월이 같고 일이 지금보다 작은 경우
3. 태어난 월이 작은 경우
현재 년도 - 태어난 년도 - 1 = 만 나이인 경우,
1. 태어난 월 & 일이 지금보다 큰 경우
2. 태어난 월이 지금과 같고, 일이 지금보다 큰 경우
위의 내용을 모두 반영할 수 있는 코드를 아래와 같이 작성해보았다.
function getWesternAge(birthday) {
let thisYear = new Date().getFullYear();
let thisMonth = new Date().getMonth()+1;
let today = new Date().getDate();
let age = thisYear - birthday.getFullYear();
if (birthday.getMonth()+1 < thisMonth ||
(birthday.getMonth()+1 === thisMonth && birthday.getDate()+1 === today) ||
(birthday.getMonth()+1 === thisMonth && birthdayDate < today)) {
return age;
} else {
return age-1;
}
}
함수에 랜덤하게 인자를 부여하여 콘솔을 찍어보니, 매번 원하는 결과가 나오는 것을 확인할 수 있었다. 나름 성공적으로 코드를 작성한듯! 하지만
||
와&&
가 너무 반복적으로 사용되어 가독성이 떨어지는데, 더 효율적인 방법은 없을지?
function getWesternAge(birthday) {
let thisYear = new Date().getFullYear();
let thisMonth = new Date().getMonth()+1;
let today = new Date().getDate();
let bYear = new Date(birthday).getFullYear();
let bMonth = new Date(birthday).getMonth()+1;
let bDate = new Date(birthday).getDate();
let age = thisYear - bYear;
let compareMonth = thisMonth - bMonth;
let compareDate = today - bDate;
if(compareMonth > 0 || (compareMonth = 0 && compareDate >= 0)){
return age;
} else {
return age -1;
}
}
막상 적고보니 코드 자체는 크게 줄어든 것 같지 않지만, 사용편의를 위한 변수 선언을 제외하면 가독성이 조금은 더 나아진 걸 볼 수 있다.
수정된 코드에서는 올해와 생일의 월 / 일을 뺀 값을 새로운 변수에 저장하여 (compareMonth & compareDate) 더 큰지 아닌지를 비교함으로써 조금 더 심플하게 코드 작성을 할 수 있었다.
.setFullYear() 메소드를 사용할 수도 있는 것 같은데, 정확하게 어떤 형태로 사용해야할지 잘 모르겠어서 일단은 이해할 수 있는 형태로 코드 작성.