기간 사이의 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.