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.
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;
}
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/
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;
}
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/
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)
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("")
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:
startDate
, endDate
aninterval
-Parameter ist optional und hat den Standardwert 'Tage'. Verwenden Sie Intervalle, die von der .add()
-Methode (moment.js) unterstützt werden. Weitere Details hiertotal
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;
};
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"]
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)
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));
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)))
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>
d3js bietet viele praktische Funktionen und enthält d3.time für einfache Datumsanpassungen
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
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);
}
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"]
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
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
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'))
});
@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;
}
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'));
};