una sumar restar obtener horas hora formato fechas fecha dias comparar actual javascript date-range

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 de interval 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ámetro total 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

d3.time

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

Aquí hay una demo funcional demo


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"]