본문 바로가기
IT관련/JavaScript

몇일 차이가 나지? JavaScript에서 날짜 계산을 해보자 (일자계산해보기 ! )

728x90

안녕하세요 ! 

오늘은 javascript에서 간단하게 날짜 계산하는법을 알아보겠습니다 !!! 

저는 typescript에서 진행할겁니다 !! 

 

먼저 !! 기본적으로 날짜를 제공해주는

Date함수를 이용하자 ! 

Date함수를 이용해서 기본적인 날짜를 가져와봅시다 ! 

밑에처럼 코드를 짜주시고 ! console.log로 확인해봅시다 ! 

이렇게 나왔습니다 !!! 

데이트 함수는 object로써 사용가능합니다 !!! 그러면 본격적으로 날짜 계산을 위한 틀을 만들어볼까요?? 

 

일자를 먼저 뽑아보겠습니다 !! ( 형식은 '년도-월-일'

export const formatDate = (dt: Date): string => {
  const y = dt.getFullYear();
  const m = ("0" + (dt.getMonth() + 1)).slice(-2);
  const d = ("0" + dt.getDate()).slice(-2);
  return y + "-" + m + "-" + d;
};

우선 ! 저렇게 해주시면 !! 2022-04-19 이런식으로 뽑아 올 수 있습니다 !! 

혹시라도 폼 형식을 - ( 하이픈 )이 아닌 / ( 슬래쉬 )로 하고싶으신분들은 바꿔주셔도 무방합니다 ! 

 

앞에 왜 0 을붙이는지와 slice를 쓰는 이유는 정확한 계산을 하기 위해서 입니다 !!!! ( 004로 해서 뒤에 2개만 추출 !  즉 04! ) 

밑에서 보여드리겠습니다 ! 

또한 

 

const m = ("0" + (dt.getMonth() + 1)).slice(-2);

저렇게 getMonth() + 1을 했는데요 ! 이유는 getMonth를 하면 현재 달이 4월이면 3이 뽑힙니다 ! 

이유는 0~11로 달을 카운팅하기 때문입니다 ! 그래서 정확하게 하려고 1을 더해줘서 정확한 날짜를 리턴 시키기 위해서 입니다 ^^ 

 

한번 실제로 봐볼까요? 

위에 보시면 실제로 getMonth()만 썼을때는 3이 뽑힙니다 !!! 현재날짜는 4월인데 !  그래서  +1을 했습니다 !  

 

자 이제 '2022-04-19' 이런식으로 쉽게 날짜를 뽑아 올 수 있습니다 !! 

그러면 일자를 계산해볼까요?? 예를 들어서 '2022-04-15'면 몇일정도 차이가 나는지?

export const getDateDiff = (dateString1: string | Date, dateString2: string | Date): number => {
  // 먼저 받아온 형식의 날짜를 date형식으로 ! 
  const date1 = new Date(dateString1);
  const date2 = new Date(dateString2);
  // 그 다음에 getTime를 써서 날짜를 계산해줍니다 ! 밀리초를 반환합니다.
  const msDiff = date1.getTime() - date2.getTime();
  // 차이는 ? (1000밀리초×60초×60분×24시간)
  return Math.ceil(msDiff / (1000 * 60 * 60 * 24));
};

자 ! 위에처럼 해주세요 ! 

getTime을 사용해서 받아온 인자를 밀리초로 바꿔서 그것을 계산해서 리턴해주는 소스입니다 ! 

그럼 결과값을 봐바야겠죠?? 

짠 ! 다 됐습니다 !!! 

먼저 getDateDiff( 날짜, 날짜 ) 이런식으로 넣어줍니다 ! 기본적으로는 앞에 날짜를 더 큰 날짜를 넣어주세요 !!! 더 알아보기 쉽게 하는게 좋잖아요 ! 

저렇게 하면 손 쉽게 일자를 계산 할 수 있습니다 !!! 

그러고 나서 Math.abs를 써서 혹시라도 실수를 했더라도 음수가 안나오게 해줍니다 !!! ( 절대값 ! ) 

 

자 ! 오늘은 여러가지로 많이 쓰이는 일자를 계산하는 법에 대해서 알아봤습니다 ! 

정말 손쉽게 사용 가능하니 한번 써보세요 !! 

지금까지 경험상 몇달, 몇시간... 이런 경우보다 훨씬 더 많이 쓰였습니다 !! 

728x90