304 Stimmen

Javascript - Array von Daten zwischen 2 Daten erhalten

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 Daten.

Der Trick dabei ist, dass auch Monats- und Jahresgrenzen berücksichtigt werden sollten.

3voto

Nicht die kürzest mögliche, aber einfach, unveränderlich und ohne Abhängigkeiten

function datesArray(start, end) {
    let result = [], current = new Date(start);
    while (current <= end)
        result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
    return result;
}

Verwendung

function datesArray(start, end) {
    let result = [], current = new Date(start);
    while (current <= end)
        result.push(current) && (current = new Date(current)) && current.setDate(current.getDate() + 1);
    return result;
 }

//  Usage

const test = datesArray(
  new Date('2020-02-26'), 
  new Date('2020-03-05')
 );

for (let i = 0; i < test.length; i ++ ) {
    console.log(
      test[i].toISOString().slice(0,10)
    );
}

2voto

koosvdkolk Punkte 331

@softvars Lösung, aber dann mit der 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;
}

2voto

sai_ekkaldevi Punkte 63

So mache ich es am liebsten

// hours * minutes * seconds * milliseconds
const DAY_IN_MS = 24 * 60 * 60 * 1000

/**
 * Get range of dates 
 * @param {Date} startDate 
 * @param {Number} numOfDays 
 * @returns {array}
 */
const dateRange = (startDate, numOfDays) => {
    const startDateMs = startDate.getTime()

    // get array of days and map it to Date object
    return [...Array(numOfDays).keys()].map(i => new Date(startDateMs + i * DAY_IN_MS))
}

2voto

d3js bietet eine Vielzahl praktischer Funktionen und umfasst d3.Zeit für einfache Datumsmanipulationen

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

Für Ihr spezielles Anliegen:

Utc

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

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

Sie können timeDay in timeHour, timeMonth usw. ändern, um die gleichen Ergebnisse in verschiedenen Intervallen zu erzielen.

1voto

Stone Punkte 2508

Ich bin mir bewusst, dass dies etwas anders ist als die gewünschte Lösung, aber ich denke, viele werden es nützlich finden.

Wenn Sie alle "x" Intervalle (Tage, Monate, Jahre, etc...) zwischen zwei Daten finden wollen, moment.js und die Momentbereich Erweiterungspakete ermöglichen diese Funktionalität.

Zum Beispiel, um jeden 30. Tag zwischen zwei Daten 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'))
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X