it-swarm.com.de

Javascript - Array von Daten zwischen 2 Daten

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

Ich möchte, dass "Range" ein Array von Datumsobjekten ist, eines für jeden Tag zwischen den beiden Datumsangaben.

Der Trick ist, dass es auch Monats- und Jahresgrenzen behandeln sollte.

Vielen Dank.

97
Scott
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;

}
11
Scott
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;
}

Hier ist eine funktionale Demohttp://jsfiddle.net/jfhartsock/cM3ZU/

139
John Hartsock

Versuchen Sie dies, denken Sie daran, den Moment js einzuschließen

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;
}
33
Mohammed Safeer

Ich benutze moment.js und Twix.js sie bieten eine sehr gute Unterstützung für die Datums- und Zeitmanipulation

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

Ich habe dies auf http://jsfiddle.net/Lkzg1bxb/

24
Ahmed Aswani
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)
12
Phrogz

Ich habe alle oben geschaut. Ich habe am Ende selbst geschrieben. Sie brauchen keine Momente dafür . Eine native for-Schleife genügt und ist am sinnvollsten, da eine for-Schleife vorhanden ist, um Werte in einem Bereich zu zählen.

Einzeiler:

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

Lange Version

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

Datumsangaben dazwischen:

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"
*/

Tage von einem früheren Datum bis jetzt:

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

Ich verwende seit einiger Zeit die @Mohammed Safeer-Lösung und habe einige Verbesserungen vorgenommen. Die Verwendung formatierter Daten ist eine schlechte Praxis, wenn Sie in Ihren Controllern arbeiten. moment().format() sollte nur zur Anzeige in Ansichten verwendet werden. Denken Sie auch daran, dass moment().clone() die Trennung von den Eingabeparametern gewährleistet, was bedeutet, dass die Eingabedaten nicht geändert werden. Ich empfehle Ihnen dringend, moment.js zu verwenden, wenn Sie mit Datumsangaben arbeiten.

Verwendungszweck:

  • Geben Sie moment.js-Datumsangaben als Werte für die Parameter startDate, endDate an
  • Der interval-Parameter ist optional und hat den Standardwert 'Tage'. Verwenden Sie Intervalle, die von der .add()-Methode (moment.js) unterstützt werden. Weitere Details hier
  • Der Parameter total ist nützlich, wenn Intervalle in Minuten angegeben werden. Der Standardwert ist 1.

Aufrufen:

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

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

Funktion:

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
Adrian Moisa

Ich arbeitete vor kurzem mit moment.js und folgte dem Trick ..

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

Ergebnis wäre:

["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"]
4
gor181

Gerade auf diese Frage gestoßen, ist der einfachste Weg, dies zu tun, mit dem Moment:

Sie müssen zuerst den Moment und den Momentbereich installieren:

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)
4
Irfy

Mit ES6 haben Sie Array.from, dh Sie können eine wirklich elegante Funktion schreiben, die dynamische Intervalle (Stunden, Tage, Monate) ermöglicht.

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

3
digiguru

Hier ist ein Einzeiler, für den keine Bibliotheken erforderlich sind, falls Sie keine weitere Funktion erstellen möchten. Ersetzen Sie einfach startDate (an zwei Stellen) und endDate (dies sind js-Datumsobjekte) durch Ihre Variablen oder Datumswerte. Natürlich können Sie es in eine Funktion einwickeln, wenn Sie möchten

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

Wenn Sie moment verwenden, können Sie deren "offizielles Plugin" für die Bereiche moment-range verwenden und dann wird dies trivial.

Momentbereichsknotenbeispiel:

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')))

moment-range browser beispiel:

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>

date fns beispiel:

Wenn Sie date-fns verwenden, ist eachDay Ihr Freund und Sie erhalten bei weitem die kürzeste und prägnanteste Antwort:

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>

2
Akrion

d3js bietet viele praktische Funktionen und enthält d3.time für einfache Datumsanpassungen

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

Für Ihre spezielle Anfrage:

Koordinierte Weltzeit

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

oder Ortszeit

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

bereich wird ein Array von Datumsobjekten sein, die für jeden Tag auf den ersten möglichen Wert fallen

sie können timeDay in timeHour, timeMonth usw. für die gleichen Ergebnisse in unterschiedlichen Intervallen ändern

2

Ich verwende eine einfache while-Schleife, um die Termine zu berechnen 

var start = new Date("01/05/2017");
var end = new Date("06/30/2017");
var newend = end.setDate(end.getDate()+1);
var 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
KARTHIKEYAN.A
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
Công Thắng

Funktion:

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

Verwendungszweck:

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

Hoffe es hilft dir

0
Hiu D

Dies kann jemandem helfen, 

Sie können die Zeilenausgabe daraus erhalten und das row_date-Objekt nach Belieben formatieren.

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

Hinweis: Ich bin mir bewusst, dass dies etwas anders ist als die angeforderte Lösung, aber ich denke, viele werden es für nützlich halten. 

Wenn Sie jedes "x" - Intervall (Tage, Monate, Jahre usw.) zwischen zwei Datumsangaben suchen möchten, aktivieren Sie die Funktionen moment.js und die Erweiterungspakete moment-range .

Zum Beispiel , um jeden 30. Tag zwischen zwei Datumsangaben zu finden:

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'))
});
0
Stone

@softvars Lösung, dann aber inklusive Option Arbeitsdaten

/**
 * 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
koosvdkolk

Hier ist eine festgelegte Methode, die Moment-Daten oder -strings oder eine Mischung als Eingaben akzeptiert und ein Array von Datumsangaben als Moment-Daten generiert. Wenn Sie nicht möchten, dass Moment-Datumsangaben ausgegeben werden, ändern Sie, was die map()-Methode zurückgibt.

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
Guy