Javascript _ date & time

연정·2021년 10월 12일
0

Javascript

목록 보기
2/4
post-thumbnail

날짜와 시간을 저장하고 보여줄 때, 날짜객체를 활용한다.
날짜객체를 활용하면, 쉽게 날짜와 시간을 얻을 수 있는데, 다음과 같은 형태로 날짜객체를 생성할 수 있다.

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를 반환받을 수 있다.

Question

만으로 계산한 나이를 구하는 함수인 getWesternAge 함수를 구현해 봅시다.

  • 이 함수는 birthday 라는 인자를 받습니다. 이 birthday는 Date 객체 입니다.
  • birthday 라는 인자를 넣었을 때, 현재를 기준으로 만으로 계산한 나이를 리턴 해주세요.

Answer

만으로 계산한 나이가 한국 나이와 같을 때 & 그렇지 않을 때의 경우의 수를 적어놓지 않으니 너무 헷갈려서, 그 내용부터 텍스트로 적어보았다.

현재 년도 - 태어난 년도 = 만 나이인 경우,
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() 메소드를 사용할 수도 있는 것 같은데, 정확하게 어떤 형태로 사용해야할지 잘 모르겠어서 일단은 이해할 수 있는 형태로 코드 작성.

profile
성장형 프론트엔드 개발자

0개의 댓글