기간 사이의 JavaScript 루프


135

Date()하나가 다른 것보다 작은 두 개의 객체가 주어지면 매일 날짜 사이에 루프를 어떻게합니까?

for(loopDate = startDate; loopDate < endDate; loopDate += 1)
{

}

이런 종류의 루프가 작동합니까? 그러나 루프 카운터에 하루를 어떻게 추가 할 수 있습니까?

감사!

답변:


201

하루를 추가하면 필요한 경우 날짜가 다음 달로 롤오버되고 밀리 초 단위로 엉망이되는 방법을 사용하여이를 수행하는 방법이 있습니다. 일광 절약 시간도 문제가되지 않습니다.

var now = new Date();
var daysOfYear = [];
for (var d = new Date(2012, 0, 1); d <= now; d.setDate(d.getDate() + 1)) {
    daysOfYear.push(new Date(d));
}

날짜를 저장하려면 위와 같이 날짜를 새로 작성해야합니다. new Date(d)그렇지 않으면 모든 저장된 날짜가 d루프에서 최종 값이 됩니다.


다른 모든 답변보다 훨씬 더 읽기 쉽습니다. 각 루프를 86400000 밀리 초 추가하면 읽기가 쉽지 않습니다.
Owen

1
일광 절약 시간에주의하십시오. d.getDate () = GMT N 및 d.getDate () + 1 = GMT N-1 인 경우 d.getDate () + 1 d.getDate () + 1은 같은 달의 일을 두 번 반환합니다.
Rafael Fontes

1
Date.now()정의 할 때 왜합니까 now? new Date() 기본적으로 현재 날짜를 객체로 반환합니다 . 생성자를 사용 Date하지 않고 호출 new하면 Date 문자열을 제공하여 Date 객체로 변환합니까?
tatlar

나를 new Date(2012, 0, 1);위해 잘못된 하루 (하루 전)를 집어 들었 습니다 new Date(Date.UTC(2012, 0, 1)).
Tk421

인터넷에서 여러 가지 솔루션을 시도했습니다. 이상하게도 때로는 며칠을 건너 뜁니다. 1.12, 2.12, 3.12, 5.12 ...와 같이 (4.12를 건너 뜁니다) 왜 그런 일이 일어 났는지 전혀 모르겠습니다.
Erik Kubica

73

Tom Gullen의 답변을 기반으로합니다.

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");


var loop = new Date(start);
while(loop <= end){
   alert(loop);           

   var newDate = loop.setDate(loop.getDate() + 1);
   loop = new Date(newDate);
}

이것을 사용하기 위해 무엇을 가져와야합니까?
DevAllanPer

3
아무것도 @DevAllanPer, Date글로벌 객체입니다 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
드미트리 Pisarev

9

startDate와 endDate가 실제로 날짜 객체 인 경우 1970 년 1 월 1 일 자정 이후 다음과 같이 밀리 초 단위로 변환 할 수 있습니다.

var startTime = startDate.getTime(), endTime = endDate.getTime();

그런 다음 1에서 다른 증분 loopTime으로 86400000 (1000 * 60 * 60 * 24)까지 루프 할 수 있습니다-하루의 밀리 초 수 :

for(loopTime = startTime; loopTime < endTime; loopTime += 86400000)
{
    var loopDay=new Date(loopTime)
    //use loopDay as you wish
}

1
+1, 제가 작업 할 수있는 충분한 시간을주었습니다. 필자는 제 질문에 작업 솔루션을 포함 시켰습니다
Tom Gullen

5
일광 절약 시간제 변경 (루프가 문제가되는 영역)을지나 반복 할 때는 작동하지 않습니다. 그렇지 않으면 좋은 해결책입니다.
chadgh

3
86400000하루에 몇 초가 있다고 가정 할 수 없습니다 . 이 루프는 일광 절약 시간제 변경 및 기타 경계 조건에 취약합니다.
Jeremy J Starcher

2
DST 외에 또 다른 에지 조건은 "Leap Second"입니다. 1 초의 차이 중요합니다. 밀리 초로 변환 된 날짜는 주어진 날짜의 첫 번째 초에 해당합니다. 1 초 오류가 발생하고 전날에 착륙했습니다.
Wojtek Kruszewski 8:27에

9

Moment.js 를 사용할 수 있다면 더 간단한 답변을 찾았 습니다 .

// cycle through last five days, today included
// you could also cycle through any dates you want, mostly for
// making this snippet not time aware
const currentMoment = moment().subtract(4, 'days');
const endMoment = moment().add(1, 'days');
while (currentMoment.isBefore(endMoment, 'day')) {
  console.log(`Loop at ${currentMoment.format('YYYY-MM-DD')}`);
  currentMoment.add(1, 'days');
}
<script src="https://cdn.jsdelivr.net/npm/moment@2/moment.min.js"></script>


5

여기 간단한 작업 코드가 나를 위해 일했습니다.

var from = new Date(2012,0,1);
var to = new Date(2012,1,20);
    
// loop for every day
for (var day = from; day <= to; day.setDate(day.getDate() + 1)) {
      
   // your day is here

}


2
var start = new Date("2014-05-01"); //yyyy-mm-dd
var end = new Date("2014-05-05"); //yyyy-mm-dd

while(start <= end){

    var mm = ((start.getMonth()+1)>=10)?(start.getMonth()+1):'0'+(start.getMonth()+1);
    var dd = ((start.getDate())>=10)? (start.getDate()) : '0' + (start.getDate());
    var yyyy = start.getFullYear();
    var date = dd+"/"+mm+"/"+yyyy; //yyyy-mm-dd

    alert(date); 

    start = new Date(start.setDate(start.getDate() + 1)); //date increase by 1
}

1

Tabare의 답변을 바탕으로주기가 끝나기 때문에 마지막 날에 하루를 더 추가해야했습니다.

var start = new Date("02/05/2013");
var end = new Date("02/10/2013");
var newend = end.setDate(end.getDate()+1);
var end = new Date(newend);
while(start < end){
   alert(start);           

   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);
}

0

밀리 초로 효율적인 방법을 원한다면 :

var daysOfYear = [];
for (var d = begin; d <= end; d = d + 86400000) {
    daysOfYear.push(new Date(d));
}

0

UI에서 시작 날짜와 종료 날짜를 가져 와서 컨트롤러의 범위 변수에 저장했다고 가정 해 봅시다.

그런 다음 모든 함수 호출에서 재설정 될 배열을 선언하여 함수에 대한 다음 호출에서 새 데이터를 저장할 수 있습니다.

var dayLabel = [];

새 날짜 를 사용 하지 않고 변수에 직접 할당하면 setDate 함수가 각 반복에서 원래 변수 값을 변경하므로 새 날짜 (시작 변수)를 사용해야합니다.

for (var d = new Date($scope.startDate); d <= $scope.endDate; d.setDate(d.getDate() + 1)) {
                dayLabel.push(new Date(d));
            }

-2

Jayarjo의 답변을 바탕으로 :

var loopDate = new Date();
loopDate.setTime(datFrom.valueOf());

while (loopDate.valueOf() < datTo.valueOf() + 86400000) {

    alert(loopDay);

    loopDate.setTime(loopDate.valueOf() + 86400000);
}

이것에 대한 한 가지 의견은 어떤 이유로 여러 달에 걸쳐 루프 할 때! = 비교가 결코 발생하지 않기 때문에 비교보다 적은 것이 선호된다는 것입니다!
Tom Gullen

1
DST 외에 또 다른 에지 조건은 "Leap Second"입니다. 1 초의 차이 중요합니다. 밀리 초로 변환 된 날짜는 주어진 날짜의 첫 번째 초에 해당합니다. 1 초 오류가 발생하고 전날에 착륙했습니다.
Wojtek Kruszewski 8:27에
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.