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); })
결과
'Programing > Scripts' 카테고리의 다른 글
[JS] ESLint를 썼더라면... (0) | 2019.10.31 |
---|---|
[Google 스프레드시트] AWS 로그 찾기 (0) | 2019.06.03 |
spring.boot - yml에서 특정 클래스 로깅 레벨 설정하기 (0) | 2018.11.07 |
복사/붙여넣기 대안 (0) | 2018.02.02 |
Y분 만에 자바스크립트 배우기 (0) | 2015.03.25 |