var range = getDates(new Date(), new Date().addDays(7));
Ich möchte, dass "Bereich" eine Reihe von Datumsobjekten ist, eines für jeden Tag zwischen den beiden Daten.
Der Trick ist, dass es auch Monats- und Jahresgrenzen behandeln sollte.
var range = getDates(new Date(), new Date().addDays(7));
Ich möchte, dass "Bereich" eine Reihe von Datumsobjekten ist, eines für jeden Tag zwischen den beiden Daten.
Der Trick ist, dass es auch Monats- und Jahresgrenzen behandeln sollte.
Antworten:
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 Demo http://jsfiddle.net/jfhartsock/cM3ZU/
startDate
und entfernen endDate
? Denn wenn startDate
die Zeit später als stopDate
die Zeit ist, wird sie nicht stopDate
in das Ergebnis einbezogen, oder?
Versuchen Sie dies, denken Sie daran, Moment 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 = [];
Details hier
var currentDate = moment(startDate);
Wenn Sie diese Methode zweimal im selben Moment verwenden. Sie werden verwirrt sein, warum sie nur beim ersten Mal funktioniert. Dies liegt daran, dass Javascripts Objekte als Referenz übergeben, sodass die Funktion das startDate zweimal verwendet (was bereits mutiert ist). Durch das Patchen des obigen Fixes wird sichergestellt, dass Sie mit neuen und einzigartigen Moment-js-Objekten im Funktionsumfang arbeiten. Überprüfen Sie diese Geige
Ich habe alle oben gesehen. Am Ende habe ich mich selbst geschrieben. Sie brauchen dafür keine Momente . Eine native for-Schleife ist ausreichend und 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=new Date(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=new Date(start); dt<=end; dt.setDate(dt.getDate()+1)){
arr.push(new Date(dt));
}
return arr;
};
Liste Daten 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 vergangenen Datum bis jetzt:
var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
getDaysArray
? Nicht die Tage dazwischen.
for (var arr=[], dt=new Date(start), ...)
. ;-)
Ich benutze moment.js und Twix.js, sie bieten eine sehr gute Unterstützung für die Manpulation von Datum und Uhrzeit
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/ laufen.
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)
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;
}
Wenn Sie moment verwenden, können Sie das "offizielle Plugin" für Bereiche verwenden, moment-range
und dann wird dies trivial.
Beispiel für einen Momentbereichsknoten:
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')))
Beispiel für einen Momentbereichsbrowser:
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>
Datum fns Beispiel:
Wenn Sie verwenden, date-fns
dann eachDay
ist 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>
Ich bin gerade auf diese Frage gestoßen. Der einfachste Weg, dies zu tun, ist die Verwendung von moment:
Sie müssen zuerst Moment und 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)
Ich verwende seit einiger Zeit die @ Mohammed Safeer-Lösung und habe einige Verbesserungen vorgenommen. Die Verwendung formatierter Daten ist eine schlechte Vorgehensweise bei der Arbeit in Ihren Controllern. moment().format()
sollte nur für Anzeigezwecke in Ansichten verwendet werden. Denken Sie auch daran, dass moment().clone()
die Trennung von Eingabeparametern gewährleistet ist, sodass die Eingabedaten nicht geändert werden. Ich empfehle Ihnen dringend, moment.js zu verwenden, wenn Sie mit Datumsangaben arbeiten.
Verwendung:
startDate
, endDate
Parameterinterval
Der Parameter ist optional und standardmäßig 'Tage'. Verwenden Sie Intervalle, die von der .add()
Methode (moment.js) unterstützt werden. Weitere Details hiertotal
Der Parameter 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;
};
Mit ES6 haben Sie Array.from, was bedeutet, dass Sie eine wirklich elegante Funktion schreiben können, 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));
new Date(2017,12,30)
ist der 30. Januar 2018, für mich beginnt der Datumsbereich am 29. Januar 2018. Nicht alle Tage sind 8,64 bis 7 ms (24 Stunden) lang, an denen die Sommerzeit beobachtet wird. ;-)
Ich habe kürzlich mit moment.js gearbeitet, gefolgt von 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"]
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"]
var
vorher strDate
in der while-Schleife haben!
d3js bietet viele praktische Funktionen und enthält d3.time für einfache Datumsmanipulationen
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 ist ein Array von Datumsobjekten, die auf den ersten möglichen Wert für jeden Tag fallen
Sie können timeDay in timeHour, timeMonth usw. ändern, um dieselben Ergebnisse in unterschiedlichen Intervallen zu erzielen
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 (js Datumsobjekte) durch Ihre Variablen oder Datumswerte. Natürlich können Sie es in eine Funktion einwickeln, wenn Sie es vorziehen
Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))
Ich benutze diese Funktion
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;
}
Ich verwende eine einfache while-Schleife, um die Zwischendaten zu berechnen
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);
}
Hinweis: Ich bin mir bewusst, dass dies etwas anders ist als die angeforderte Lösung, aber ich denke, viele werden es nützlich finden.
Wenn Sie jedes "x" -Intervall (Tage, Monate, Jahre usw.) zwischen zwei Datumsangaben suchen möchten , aktivieren moment.js und die Erweiterungspakete für den Momentbereich diese Funktionalität.
So finden Sie beispielsweise jeden 30. Tag zwischen zwei Daten :
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'))
});
Generieren Sie eine Reihe von Jahren:
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())
Generieren Sie ein Array für einen Monat:
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())
Generieren Sie ein Arrays für Tage:
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())
Dies kann jemandem helfen,
Sie können die Zeilenausgabe daraus abrufen und das row_date-Objekt nach Ihren Wünschen 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
Hier ist eine vordefinierte Methode, die Momentdaten oder Zeichenfolgen oder eine Mischung als Eingaben akzeptiert und eine Reihe von Daten als Momentdaten generiert. Wenn Sie keine Momentdaten als Ausgabe wünschen, ändern Sie die map()
Rückgabe der Methode.
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'));
};
@ softvars Lösung, aber dann einschließlich Arbeitsdatum Option
/**
* 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;
}
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;
};
Verwendung:
var dates = getDatesRange(new Date(2019,01,01), new Date(2019,01,25));
dates.forEach(function(date) {
console.log(date);
});
Hoffe es hilft dir