15 ответов:
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; }здесь-это функциональный демо http://jsfiddle.net/jfhartsock/cM3ZU/
попробуйте это, не забудьте включить момент 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; }
Я использую момент.js и Twix.js Они обеспечивают очень большую поддержку для даты и времени manpulation
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);У меня это работает на 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)
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; }
Я использую решение @Mohammed Safeer некоторое время, и я сделал несколько улучшений. Использование форматированных дат является плохой практикой при работе в контроллерах.
moment().format()должны использоваться только для отображения в представлениях. Также помните, чтоmoment().clone()обеспечивает отделение от входных параметров, что означает, что входные даты не изменяются. Я настоятельно рекомендую вам использовать момент.js при работе с датами.использование:
- обеспечить момент.Яш даты значения для
startDate,endDateпараметрыintervalпараметр является необязательным и по умолчанию имеет значение "дней". Используйте интервалы, поддерживаемые.add()метод (момент.js). подробнее здесьtotalпараметр полезен при указании интервалов в минутах. По умолчанию он равен 1.Invoke:
var startDate = moment(), endDate = moment().add(1, 'days'); getDatesRangeArray(startDate, endDate, 'minutes', 30);функция:
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; };
Я посмотрел все выше. Кончилось тем, что я написал сам. вам не нужно momentjs для этого. родной для цикла достаточно и имеет смысл, потому что цикл for существует для подсчета значений в диапазоне.
Один Лайнер:
var getDaysArray = function(s,e) {for(var a=[],d=s;d<=e;d.setDate(d.getDate()+1)){ a.push(new Date(d));}return a;};Текст
var getDaysArray = function(start, end) { for(var arr=[],dt=start; dt<=end; dt.setDate(dt.getDate()+1)){ arr.push(new Date(dt)); } return arr; };список дат между:
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" */дней с прошлой даты до настоящего времени:
var daylist = getDaysArray(new Date("2018-05-01"),new Date()); daylist.map((v)=>v.toISOString().slice(0,10)).join("")
Я недавно работал с момента.Яш, после сделали свое дело..
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));результат будет такой:
["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"]
просто наткнулся на этот вопрос, самый простой способ сделать это-через мгновение:
сначала нужно установить moment и moment-range:
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)
вот один лайнер, который не требует никаких библиотек, в случае, если вы не хотите создавать другую функцию. Просто замените startDate (в двух местах) и endDate (которые являются объектами даты js) с вашими переменными или значениями даты. Конечно, вы можете обернуть его в функцию, если вы предпочитаете
Array(Math.floor((endDate - startDate) / 86400000) + 1).fill().map((_, idx) => (new Date(startDate.getTime() + idx * 86400000)))
d3js предоставляет множество удобных функций и включает в себя d3.время для легких манипуляций даты
для вашего конкретного запроса:
Utc
var range = d3.utcDay.range(new Date(), d3.utcDay.offset(new Date(), 7));или по местному времени
var range = d3.timeDay.range(new Date(), d3.timeDay.offset(new Date(), 7));диапазон будет представлять собой массив объектов даты, которые попадают на первое возможное значение для каждого дня
вы можете изменить timeDay на timeHour, timeMonth и т. д. Для того же результаты на разных интервалах
С помощью ES6 у вас есть массив.из значения вы можете написать действительно элегантную функцию, которая позволяет использовать динамические интервалы (часы, дни, месяцы).
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));
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"]
Я использую простой цикл while, для расчета между датами
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); }
Это может помочь кому-то,
вы можете получить вывод строки из этого и форматировать объект row_date, как вы хотите.
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
Comments