자바 스크립트-두 날짜 사이의 날짜 배열 가져 오기


155
var range = getDates(new Date(), new Date().addDays(7));

"range"는 두 날짜 사이에서 매일 하나씩 날짜 개체의 배열이되기를 원합니다.

요령은 월과 연도 경계도 처리해야한다는 것입니다.

답변:


171
Date.prototype.addDays = function(days) {
    var date = new Date(this.valueOf());
    date.setDate(date.getDate() + days);
    return date;
}

function getDates(startDate, stopDate) {
    var dateArray = new Array();
    var currentDate = startDate;
    while (currentDate <= stopDate) {
        dateArray.push(new Date (currentDate));
        currentDate = currentDate.addDays(1);
    }
    return dateArray;
}

다음은 기능 데모입니다. http://jsfiddle.net/jfhartsock/cM3ZU/


2
고마워 존. 나는 주로 당신을 사용했지만, 당신은 byRef 버그를 가지고 있습니다. currentDate = new Date (currentDate)로 변경하면 작동합니다.
Scott Klarenbach

이것은 미래의 날짜에 적합하지만 30 일 전과 같은 과거 날짜를 작업 할 때 위의 코드를 변경하여 시간이 아닌 날짜 만 가져 오십시오.
vaibhav kulkarni

@vaibhavkulkarni 간단히 addays () 프로토 타입을 뒤집고 while 루프를 수정할 수 있습니다. 또한 의견은 새로운 질문을 시작하는 장소가 아닙니다.
John Hartsock

startDate와 에서 시간을 더 잘 제거해야합니까 endDate? 왜냐하면 만약 startDate의 시간이 나중에보다 stopDate의 시간 '이 포함되지 않습니다 stopDate권리, 그 결과에?
Hp93

@ Hp93 정확히 무슨 말을하는지 모르겠습니다. 내가 제공 한 바이올린을 실행하면 그 상황을 다루는 것을 볼 수 있습니다.
John

58

이것을 시도하십시오, 순간 js를 포함시키는 것을 잊지 마십시오.

function getDates(startDate, stopDate) {
    var dateArray = [];
    var currentDate = moment(startDate);
    var stopDate = moment(stopDate);
    while (currentDate <= stopDate) {
        dateArray.push( moment(currentDate).format('YYYY-MM-DD') )
        currentDate = moment(currentDate).add(1, 'days');
    }
    return dateArray;
}

단지 약간의 개선 : 배열을 만들기위한 속기 표기법을 권장합니다 여기에var dateArray = []; 세부 사항
Adrian Moisa

배열을 정의하는 새로운 방법이며 더 짧거나 깨끗하다고 ​​가정합니다.
Mohammed Safeer

1
중요 수정 : var currentDate = moment(startDate);동일한 moment.js 날짜 에이 방법을 두 번 사용하는 경우 왜 처음 작동하는지 의아해합니다. 이것은 자바 스크립트가 참조로 객체를 전달하기 때문에 startDate를 두 번 사용하여 함수가 끝나기 때문에 발생합니다 (이미 변경되었습니다). 위 수정을 패치하면 함수 범위에서 새롭고 고유 한 순간 js 객체로 깨어납니다. 이 바이올린을
Adrian Moisa

52

나는 위의 모든 것을 보았다. 나 자신을 쓰는 것을 끝내었다. 이를 위해 momentjs가 필요하지 않습니다 . for 루프는 범위 내에서 값을 계산하기 위해 존재하므로 기본 for 루프이면 충분 하며 가장 적합합니다.

짧막 한 농담:

var getDaysArray = function(s,e) {for(var a=[],d=new Date(s);d<=e;d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};

긴 버전

var getDaysArray = function(start, end) {
    for(var arr=[],dt=new Date(start); dt<=end; dt.setDate(dt.getDate()+1)){
        arr.push(new Date(dt));
    }
    return arr;
};

사이에 날짜를 나열하십시오.

var daylist = getDaysArray(new Date("2018-05-01"),new Date("2018-07-01"));
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
/*
Output: 
    "2018-05-01
    2018-05-02
    2018-05-03
    ...
    2018-06-30
    2018-07-01"
*/

과거 날짜부터 지금까지의 날짜 :

var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")

지정한 요일을 모두 가져 오려면 어떻게해야 getDaysArray합니까? 그 사이의 일이 아닙니다.
Jonjie

감사! 종속성없이 필요한 것. :)
mpsyp

2
이 기능은 소스 입력 날짜를 조작합니다. :) 나는 그것을 테스트했다.
Hamed Taheri

4
@HamedTaheri-예, 그러나 start 자체 대신 start 사본 을 dt 에 할당하면 해결할 수 있습니다 (예 :) . ;-)for (var arr=[], dt=new Date(start), ...)
RobG

많은 사람들과 함께 일할 때 소프트웨어 유지 보수에서 for (;;) 루프를 읽을 수는 없습니다.
Victor

27

나는 moment.jsTwix.js 를 사용하여 날짜 및 시간 조작을 매우 잘 지원합니다.

var itr = moment.twix(new Date('2012-01-15'),new Date('2012-01-20')).iterate("days");
var range=[];
while(itr.hasNext()){
    range.push(itr.next().toDate())
}
console.log(range);

http://jsfiddle.net/Lkzg1bxb/에서 실행 중입니다.


나는 그것과 관련된 모든 파일을 다운로드했지만 여전히 오류 TypeError를 보여줍니다 : moment.twix는 기능이 아닙니다
vaibhav kulkarni

라이브러리를 포함해야 할 수도 있습니다. nodejs에서는 다음과 같이 진행됩니다. var moment = require ( 'moment'); require ( 'twix');
박사 Bala Soundararaj

18
var boxingDay = new Date("12/26/2010");
var nextWeek  = boxingDay*1 + 7*24*3600*1000;

function getDates( d1, d2 ){
  var oneDay = 24*3600*1000;
  for (var d=[],ms=d1*1,last=d2*1;ms<last;ms+=oneDay){
    d.push( new Date(ms) );
  }
  return d;
}

getDates( boxingDay, nextWeek ).join("\n");
// Sun Dec 26 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Mon Dec 27 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Tue Dec 28 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Wed Dec 29 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Thu Dec 30 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Fri Dec 31 2010 00:00:00 GMT-0700 (Mountain Standard Time)
// Sat Jan 01 2011 00:00:00 GMT-0700 (Mountain Standard Time)

3
위와 달리 안전을 위해 보통 일광 절약 시간으로 인한 약간의 변화를 피하기 위해 하루 중반에 시간을 선택해야합니다.
프록 츠

하루 중반 변경 사항을 코드에 추가하기를 바랍니다.

15
function (startDate, endDate, addFn, interval) {

 addFn = addFn || Date.prototype.addDays;
 interval = interval || 1;

 var retVal = [];
 var current = new Date(startDate);

 while (current <= endDate) {
  retVal.push(new Date(current));
  current = addFn.call(current, interval);
 }

 return retVal;

}

1
이것은 당신이 잘못된 순서의 날짜 제공하는 경우 동결
pie6k

11

당신이 순간을 사용하는 경우 당신은 범위에 대한 "공식 플러그인"을 사용할 수 있습니다 moment-range 이것은 사소한된다.

모멘트 범위 노드 예 :

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const start = new Date("11/30/2018"), end = new Date("09/30/2019")
const range = moment.range(moment(start), moment(end));

console.log(Array.from(range.by('day')))

순간 범위 브라우저 예 :

window['moment-range'].extendMoment(moment);

const start = new Date("11/30/2018"), end = new Date("09/30/2019")
const range = moment.range(moment(start), moment(end));

console.log(Array.from(range.by('day')))
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment-range/4.0.1/moment-range.js"></script>

날짜 fns 예 :

당신이 사용하는 경우 date-fns다음 eachDay당신의 친구가 당신이 지금까지 가장 짧고 간결한 답변으로 얻을 :

console.log(dateFns.eachDay(
  new Date(2018, 11, 30),
  new Date(2019, 30, 09)
))
<script src="https://cdnjs.cloudflare.com/ajax/libs/date-fns/1.29.0/date_fns.min.js"></script>


8

이 질문을 겪은 가장 쉬운 방법은 순간을 사용하는 것입니다.

먼저 모멘트 및 모멘트 범위를 설치해야합니다.

const Moment = require('moment');
const MomentRange = require('moment-range');
const moment = MomentRange.extendMoment(Moment);

const start = moment()
const end = moment().add(2, 'months')
const range = moment.range(start, end)
const arrayOfDates = Array.from(range.by('days'))
console.log(arrayOfDates)

6

@Mohammed Safeer 솔루션을 한동안 사용해 왔으며 몇 가지 개선했습니다. 컨트롤러에서 작업하는 동안 형식이 지정된 날짜를 사용하는 것은 좋지 않습니다. moment().format()뷰에서 표시 목적으로 만 사용해야합니다. 또한 기억moment().clone() 입력 매개 변수와의 분리 보장하므로 입력 날짜가 변경되지 않습니다. 날짜를 다룰 때 moment.js를 사용하는 것이 좋습니다.

용법:

  • 의 값으로 moment.js 날짜를 제공 startDate, endDate매개 변수
  • interval매개 변수는 선택 사항이며 기본값은 'days'입니다. .add()메소드 (moment.js)에 의해 지원되는 간격을 사용하십시오 . 자세한 내용은 여기
  • total매개 변수는 간격을 분 단위로 지정할 때 유용합니다. 기본값은 1입니다.

호출

var startDate = moment(),
    endDate = moment().add(1, 'days');

getDatesRangeArray(startDate, endDate, 'minutes', 30);

함수:

var getDatesRangeArray = function (startDate, endDate, interval, total) {
    var config = {
            interval: interval || 'days',
            total: total || 1
        },
        dateArray = [],
        currentDate = startDate.clone();

    while (currentDate < endDate) {
        dateArray.push(currentDate);
        currentDate = currentDate.clone().add(config.total, config.interval);
    }

    return dateArray;
};

6

ES6을 사용하면 Array.from을 사용하여 동적 간격 (시간, 일, 월)을 허용하는 정말 우아한 함수를 작성할 수 있습니다.

function getDates(startDate, endDate, interval) {
const duration = endDate - startDate;
const steps = duration / interval;
return Array.from({length: steps+1}, (v,i) => new Date(startDate.valueOf() + (interval * i)));
}
const startDate = new Date(2017,12,30);
const endDate = new Date(2018,1,3);
const dayInterval = 1000 * 60 * 60 * 24; // 1 day
const halfDayInterval = 1000 * 60 * 60 * 12; // 1/2 day

console.log("Days", getDates(startDate, endDate, dayInterval));
console.log("Half Days", getDates(startDate, endDate, halfDayInterval));


2
"우아한"은 당신의 관점에 달려 있습니다. new Date(2017,12,30)날짜 범위는 2018 년 1 월 29 일부터 시작됩니다. 일광 절약 시간이 준수되는 모든 날의 길이가 8.64e7ms (24 시간) 인 것은 아닙니다. ;-)
RobG

5

나는 최근에 moment.js로 작업하고 있었고 다음과 같은 트릭을 수행했습니다.

function getDateRange(startDate, endDate, dateFormat) {
        var dates = [],
            end = moment(endDate),
            diff = endDate.diff(startDate, 'days');

        if(!startDate.isValid() || !endDate.isValid() || diff <= 0) {
            return;
        }

        for(var i = 0; i < diff; i++) {
            dates.push(end.subtract(1,'d').format(dateFormat));
        }

        return dates;
    };
    console.log(getDateRange(startDate, endDate, dateFormat));

결과는 다음과 같습니다.

["09/03/2015", "10/03/2015", "11/03/2015", "12/03/2015", "13/03/2015", "14/03/2015", "15/03/2015", "16/03/2015", "17/03/2015", "18/03/2015"]

3
var listDate = [];
var startDate ='2017-02-01';
var endDate = '2017-02-10';
var dateMove = new Date(startDate);
var strDate = startDate;

while (strDate < endDate){
  var strDate = dateMove.toISOString().slice(0,10);
  listDate.push(strDate);
  dateMove.setDate(dateMove.getDate()+1);
};
console.log(listDate);

//["2017-02-01", "2017-02-02", "2017-02-03", "2017-02-04", "2017-02-05", "2017-02-06", "2017-02-07", "2017-02-08", "2017-02-09", "2017-02-10"]

1
다른 사람이 설명을 요구하지 않고 쉽게 이해할 수 있도록 답변에 대한 자세한 설명 및 / 또는 정보와 질문이 해결 된 방법을 추가하십시오
koceeng

나는 어떤 이유로 2016-03-31을 건너 뜁니다!
woodhead92

1
당신은하지 말았어야 var하기 전에 strDateWhile 루프 내부!
Boris Yakubchik

2

d3js 는 많은 편리한 기능을 제공하며 쉬운 날짜 조작을위한 d3.time 을 포함 합니다.

https://github.com/d3/d3-time

특정 요청의 경우 :

Utc

var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7));

또는 현지 시간

var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7));

range는 매일 가능한 첫 번째 값에 해당하는 날짜 객체의 배열입니다.

다른 간격으로 동일한 결과에 대해 timeDay to timeHour, timeMonth 등을 변경할 수 있습니다


2

다른 함수를 만들고 싶지 않은 경우 라이브러리가 필요없는 라이너 하나입니다. startDate (두 곳)와 endDate (js 날짜 객체)를 변수 또는 날짜 값으로 바꾸십시오. 물론 원하는 경우 함수로 묶을 수 있습니다.

Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))

일광 / 표준 절약 시간 변경을 고려하지 않습니다. 며칠이 더 길고 더 짧습니다
Mike

2

이 기능을 사용합니다

function getDatesRange(startDate, stopDate) {
    const ONE_DAY = 24*3600*1000;
    var days= [];
    var currentDate = new Date(startDate);
    while (currentDate <= stopDate) {
        days.push(new Date (currentDate));
        currentDate = currentDate - 1 + 1 + ONE_DAY;
    }
    return days;
}

2

간단한 while 루프를 사용하여 날짜 사이를 계산하고 있습니다.

var start = new Date("01/05/2017");
var end = new Date("06/30/2017");
var newend = end.setDate(end.getDate()+1);
end = new Date(newend);
while(start < end){
   console.log(new Date(start).getTime() / 1000); // unix timestamp format
   console.log(start); // ISO Date format          
   var newDate = start.setDate(start.getDate() + 1);
   start = new Date(newDate);
}


1

참고 : 이것이 요청한 솔루션과 약간 다르다는 것을 알고 있지만 많은 사람들이 유용하다고 생각합니다.

두 날짜 사이에 각 "x"간격 (일, 월, 년 등)을 찾으려면 moment.js모멘트 범위 확장 패키지를 통해이 기능을 사용할 수 있습니다.

예를 들어, 두 날짜 사이에서 30 일마다 찾기 :

window['moment-range'].extendMoment(moment);

var dateString = "2018-05-12 17:32:34.874-08";
var start  = new Date(dateString);
var end    = new Date();
var range1 = moment.range(start, end);
var arrayOfIntervalDates = Array.from(range1.by('day', { step: 30 }));

arrayOfIntervalDates.map(function(intervalDate){
  console.log(intervalDate.format('YY-M-DD'))
});

1
  1. 연도 배열을 생성하십시오.

    const DAYS = () => {
     const days = []
     const dateStart = moment()
     const dateEnd = moment().add(30, days')
     while (dateEnd.diff(dateStart, days') >= 0) {
      days.push(dateStart.format(‘D'))
      dateStart.add(1, days')
     }
     return days
    }
    console.log(DAYS())
  2. 월 배열을 생성하십시오.

            const MONTHS = () => {
             const months = []
             const dateStart = moment()
             const dateEnd = moment().add(12, month')
             while (dateEnd.diff(dateStart, months') >= 0) {
              months.push(dateStart.format(‘M'))
              dateStart.add(1, month')
             }
             return months
            }
            console.log(MONTHS())
  3. 일 동안 배열을 생성하십시오.

            const DAYS = () => {
             const days = []
             const dateStart = moment()
             const dateEnd = moment().add(30, days')
             while (dateEnd.diff(dateStart, days') >= 0) {
              days.push(dateStart.format(‘D'))
              dateStart.add(1, days')
             }
             return days
            }
            console.log(DAYS())

1

momentJS를 사용하여 쉽게 할 수 있습니다

종속성에 순간 추가

npm i moment

그런 다음 파일로 가져옵니다.

var moment = require("moment");

그런 다음 다음 코드를 사용하여 두 날짜 사이의 모든 날짜 목록을 가져옵니다.

let dates = [];
let currDate = moment.utc(new Date("06/30/2019")).startOf("day");
let lastDate = moment.utc(new Date("07/30/2019")).startOf("day");

do {
 dates.push(currDate.clone().toDate());
} while (currDate.add(1, "days").diff(lastDate) < 0);
dates.push(currDate.clone().toDate());

console.log(dates);

0

이것은 누군가를 도울 수 있습니다.

이것으로부터 행 출력을 얻고 원하는대로 row_date 객체를 포맷 할 수 있습니다.

var from_date = '2016-01-01';
var to_date = '2016-02-20';

var dates = getDates(from_date, to_date);

console.log(dates);

function getDates(from_date, to_date) {
  var current_date = new Date(from_date);
  var end_date     = new Date(to_date);

  var getTimeDiff = Math.abs(current_date.getTime() - end_date.getTime());
  var date_range = Math.ceil(getTimeDiff / (1000 * 3600 * 24)) + 1 ;

  var weekday = ["SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"];
  var months = ["JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"];
  var dates = new Array();

  for (var i = 0; i <= date_range; i++) {
     var getDate, getMonth = '';

     if(current_date.getDate() < 10) { getDate = ('0'+ current_date.getDate());}
     else{getDate = current_date.getDate();}

    if(current_date.getMonth() < 9) { getMonth = ('0'+ (current_date.getMonth()+1));}
    else{getMonth = current_date.getMonth();}

    var row_date = {day: getDate, month: getMonth, year: current_date.getFullYear()};
    var fmt_date = {weekDay: weekday[current_date.getDay()], date: getDate, month: months[current_date.getMonth()]};
    var is_weekend = false;
    if (current_date.getDay() == 0 || current_date.getDay() == 6) {
        is_weekend = true;
    }
    dates.push({row_date: row_date, fmt_date: fmt_date, is_weekend: is_weekend});
    current_date.setDate(current_date.getDate() + 1);
 }
 return dates;
}

https://gist.github.com/pranid/3c78f36253cbbc6a41a859c5d718f362.js


0

다음은 순간 날짜 또는 문자열 또는 혼합물을 입력으로 허용하고 날짜 배열을 순간 날짜로 생성하는 미리 준비된 방법입니다. 모멘트 날짜를 출력으로 원하지 않으면 map()메소드가 리턴 하는 내용을 변경하십시오 .

const moment = require('moment');

// ...

/**
 * @param {string|import('moment').Moment} start
 * @param {string|import('moment').Moment} end
 * @returns {import('moment').Moment[]}
 */
const getDateRange = (start, end) => {
  const s = moment.isMoment(start) ? start : moment(start);
  const e = moment.isMoment(end) ? end : moment(end);
  return [...Array(1 + e.diff(s, 'days')).keys()].map(n => moment(s).add(n, 'days'));
};

0

@ softvar의 솔루션이지만 작업 날짜 옵션 포함

/**
 * Returns array of working days between two dates.
 *
 * @param {string} startDate
 *   The start date in yyyy-mm-dd format.
 * @param {string} endDate
 *   The end date in yyyy-mm-dd format.
 * @param {boolean} onlyWorkingDays
 *   If true only working days are returned. Default: false
 *
 * @return {array}
 *   Array of dates in yyyy-mm-dd string format.
 */
function getDates(startDate, stopDate, onlyWorkingDays) {
  let doWd = typeof onlyWorkingDays ==='undefined' ? false : onlyWorkingDays;

  let dateArray = [];  
  let dayNr;
  let runDateObj = moment(startDate);  
  let stopDateObj = moment(stopDate);

  while (runDateObj <= stopDateObj) {
    dayNr = runDateObj.day();
    if (!doWd || (dayNr>0 && dayNr<6)) {
     dateArray.push(moment(runDateObj).format('YYYY-MM-DD'));  
    }

    runDateObj = moment(runDateObj).add(1, 'days');
  }
  return dateArray;
}

0

함수:

  var dates = [],
      currentDate = startDate,
      addDays = function(days) {
        var date = new Date(this.valueOf());
        date.setDate(date.getDate() + days);
        return date;
      };
  while (currentDate <= endDate) {
    dates.push(currentDate);
    currentDate = addDays.call(currentDate, 1);
  }
  return dates;
};

용법:

var dates = getDatesRange(new Date(2019,01,01), new Date(2019,01,25));                                                                                                           
dates.forEach(function(date) {
  console.log(date);
});

그것이 당신을 돕는 희망

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.