Programing/Scripts

자바스크립트에서 날짜별 iterate 하기

나모찾기 2018. 3. 6. 16:30

Date 객체는 자바스크립트에서 날짜와 시간을 표시하는 객체이다.


for loop처럼 날짜를 generate해서 iterate하는 것을 만들어보자.

참고로 시간은 yyyymmdd 형식으로 만드는 것이 보기에 좋을 것이라서 아래 prototype을 사용한다.

출처: Stack Overflow: Get String in YYYYMMDD format from JS date object?

Date.prototype.yyyymmdd = function() {

  var mm = this.getMonth() + 1; // getMonth() is zero-based

  var dd = this.getDate();


  return [this.getFullYear(),

          (mm>9 ? '' : '0') + mm,

          (dd>9 ? '' : '0') + dd

         ].join('');

};


Date 객체에 대한 것은 지우아빠님이 잘 정리해놓은 글이 있다. 아래 블로그를 참고하자.

http://bluejinzzang.tistory.com/entry/Date-객체의-생성


오늘부터 과거 특정일(예. 1988년 9월 17일)까지 생성한 문자열을 console.log로 출력해보자.


1) 오늘 날짜를 구하기

var now = new Date();

now.yyyymmdd();



2) 하루 빼기

now.setDate(now.getDate() - 1);

now.yyyymmdd();



3) 멈춰야 할 날짜 객체 만들기

- 주의해야 할 점은 날짜를 받는 인자는 0이 1월이다. 따라서 9월은 8을 입력해야 한다.

var endDate = new Date(1988, 8, 17);

endDate.yyyymmdd();



4) 비교가 잘 수행되나?

당연히 어제 시간(위에서 하루를 뺐다)이 올림픽 시작일 보다 크다.

now < endDate

now == endDate

now > endDate



5) 루프로 구성하기

var curr = new Date();

var end = new Date(1988, 8, 17);


while (curr < end) {

console.log(curr.yyyymmdd());

curr.setDate(now.getDate() - 1);

}


6) 모듈로 만들기

- 안지로 오늘부터 loop를 돌 날짜(연월일)와 생성한 날짜에 대해 수행할 콜백 함수를 인자로 받도록 하였다.

- 콜백함수에서는 단순히 콘솔 출력만 한다.

- 재사용이 가능한 함수로 만든다.

function loopDateFromTodayTo(yyyy, mm, dd, callback) {

var curr = new Date();

var end = new Date(yyyy, mm - 1, dd);


while (curr < end) {

callback(curr.yyyymmdd());

curr.setDate(curr.getDate() - 1);

}

}


loopDateFromTodayTo(2019, 3, 1, function(dt) { console.log(dt); })


문제는 위와 같이 했을 때 무한루프에 빠지게 된다는 것이다.

왜 그럴까??

결국 날짜수의 차를 구해서 날짜수만큼 반복하게 하였다.

참고: http://jwchoi85.tistory.com/230


최종

if (Date.prototype.yyyymmdd === undefined) {

Date.prototype.yyyymmdd = function() {

  var mm = this.getMonth() + 1; // getMonth() is zero-based

  var dd = this.getDate();


  return [this.getFullYear(),

          (mm>9 ? '' : '0') + mm,

          (dd>9 ? '' : '0') + dd

         ].join('');

};

}


function loopDateFromToday(yyyy, mm, dd, callback) {

var curr = new Date();

var end = new Date(yyyy, mm - 1, dd);

var betweenDay = (curr.getTime() - end.getTime()) / 1000 / 60 / 60 / 24;


while (betweenDay > 0) {

betweenDay--;

callback(curr.yyyymmdd());

curr.setDate(curr.getDate() - 1);

}

}


loopDateFromToday(2018, 3, 1, function(dt) { console.log(dt); })


결과