2016-12-17 5 views
0

Учитывая дату начала и дату окончания, как я могу получить все, например. По воскресеньям с 1 сентября по 2 ноября?Как добраться до воскресенья/понедельника/понедельника между двумя датами?

Примечание - не дубликата: Я не хочу счетчика, а отдельные даты, как ни яваскрипт даты или momentjs объектов (ответ связан с другими, так вопросом просить графа)

+1

Я не знаю, почему ваш вопрос опущен и отмечен как дубликат. Это явно не так. – theCrius

ответ

7

Используйте цикл, чтобы непрерывно получать дату следующего воскресенья, пока вы не закончите дату окончания.

var start = moment('2016-09-01'), // Sept. 1st 
 
    end = moment('2016-11-02'), // Nov. 2nd 
 
    day = 0;     // Sunday 
 

 
var result = []; 
 
var current = start.clone(); 
 

 
while (current.day(7 + day).isBefore(end)) { 
 
    result.push(current.clone()); 
 
} 
 

 
console.log(result.map(m => m.format('LLLL')));
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

2

Вы можете перейти от даты начала до ближайшего дня требуемого имени, то просто продолжайте добавлять 7 дней до тех пор, пока вы мимо конечной даты, например,

/* Given a start date, end date and day name, return 
 
** an array of dates between the two dates for the 
 
** given day inclusive 
 
** @param {Date} start - date to start from 
 
** @param {Date} end - date to end on 
 
** @param {string} dayName - name of day 
 
** @returns {Array} array of Dates 
 
*/ 
 
function getDaysBetweenDates(start, end, dayName) { 
 
    var result = []; 
 
    var days = {sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6}; 
 
    var day = days[dayName.toLowerCase().substr(0,3)]; 
 
    // Copy start date 
 
    var current = new Date(start); 
 
    // Shift to next of required days 
 
    current.setDate(current.getDate() + (day - current.getDay() + 7) % 7); 
 
    // While less than end date, add dates to result array 
 
    while (current < end) { 
 
    result.push(new Date(+current)); 
 
    current.setDate(current.getDate() + 7); 
 
    } 
 
    return result; 
 
} 
 

 
// Get Wednesdays between 15 December, 2016 and 25 February, 2017. 
 
console.log(getDaysBetweenDates(
 
       new Date(2016,11,15), 
 
       new Date(2017,1,25), 
 
       'Wed'));

Обратите внимание, что SO утешать печатает даты как ISO 8601 UTC по умолчанию, так что пользователи к востоку от Гринвича будет видеть даты один день раньше, чем ожидалось. Кроме того, функция должна проверять ввод, т. Е. Проверять, что он имеет действительные начальные и конечные объекты Date и что dayName действителен.

Смежные вопросы