sumar - restar fechas javascript
Javascript: obtenga una matriz de fechas entre 2 fechas (15)
var range = getDates(new Date(), new Date().addDays(7));
Me gustaría que "rango" sea una matriz de objetos de fecha, uno por cada día entre las dos fechas.
El truco es que también debe manejar los límites de mes y año.
Gracias.
Acabo de encontrar esta pregunta, la forma más fácil de hacerlo es usar el momento:
Primero debe instalar el intervalo de momento y momento:
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)
Aquí hay un trazador de líneas que no requiere ninguna biblioteca en caso de que no desee crear otra función. Simplemente reemplace startDate (en dos lugares) y endDate (que son objetos de fecha js) con sus variables o valores de fecha. Por supuesto, podrías envolverlo en una función si prefieres
Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))
Esto puede ayudar a alguien,
Puede obtener el resultado de la fila a partir de esto y formatear el objeto row_date como desee.
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
Estoy usando un ciclo simple para calcular las fechas entre
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);
}
He estado usando la solución @Mohammed Safeer por un tiempo e hice algunas mejoras. Usar fechas formateadas es una mala práctica mientras trabajas en tus controladores. moment().format()
debe usarse solo para fines de visualización en vistas. Recuerde también que moment().clone()
garantiza la separación de los parámetros de entrada, lo que significa que las fechas de entrada no se modifican. Le recomiendo encarecidamente que utilice moment.js cuando trabaje con fechas.
Uso:
- Proporcione las fechas de moment.js como valores para los parámetros
startDate
,endDate
-
interval
parámetro deinterval
es opcional y el valor predeterminado es ''días''. Use intervalos soportados por el método.add()
(moment.js). Más detalles aquí -
total
parámetrototal
es útil al especificar intervalos en minutos. Por defecto es 1.
Invocar:
var startDate = moment(),
endDate = moment().add(1, ''days'');
getDatesRangeArray(startDate, endDate, ''minutes'', 30);
Función:
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;
};
Miré a todos los de arriba. Terminé escribiéndome a mí mismo. No necesitas un momento para esto . Un bucle for nativo es suficiente y tiene más sentido porque existe un bucle for para contar valores en un rango.
Un trazador de líneas:
var getDaysArray = function(s,e) {for(var a=[],d=s;d<=e;d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};
Versión larga
var getDaysArray = function(start, end) {
for(var arr=[],dt=start; dt<=end; dt.setDate(dt.getDate()+1)){
arr.push(new Date(dt));
}
return arr;
};
Enumere las fechas entre:
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"
*/
Días desde una fecha pasada hasta ahora:
var daylist = getDaysArray(new Date("2018-05-01"),new Date());
daylist.map((v)=>v.toISOString().slice(0,10)).join("")
Prueba esto, recuerda incluir el momento 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;
}
Recientemente estuve trabajando con moment.js, siguiendo hice el truco ..
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));
El resultado sería:
["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"]
Usando ES6 tienes Array.from que significa que puedes escribir una función realmente elegante, que permite Intervalos dinámicos (horas, días, meses).
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));
Uso moment.js y Twix.js proporcionan una gran ayuda para la manupulación de fecha y hora
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);
Lo tengo corriendo en http://jsfiddle.net/Lkzg1bxb/
d3js proporciona muchas funciones útiles e incluye d3.time para manipulaciones de fecha fáciles
Para su solicitud específica:
UTC
var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7));
o hora local
var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7));
rango será una matriz de objetos de fecha que caen en el primer valor posible para cada día
puede cambiar timeDay por timeHour, timeMonth, etc. por los mismos resultados en diferentes intervalos
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;
}
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;
}
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)
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"]