본문 바로가기

Programing/Scripts

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

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); })


결과