Как найти одинаковую комбинацию недели/дня недели для каждого месяца с помощью javascript

Вот я пытаюсь рассчитать повторяющиеся даты в диапазоне дат. Я вставляю приведенный ниже код, который относится только к повторяющейся части моего кода. В нем нет логики вычисления одного и того же дня каждого месяца или какого-либо шаблона. Он имеет только интервал. Пожалуйста, предложите решение, чтобы узнать один и тот же день каждого месяца из массива between[], который уже содержит только диапазон между датами начала и окончания.

switch (true) {
    case (interval == 7):
        //weekly
        //Push in the selected dates in the selected array.
        for (var i = 0; i < between.length; i += 7) {
            selected.push(between[i]);
        }
        break;
    case (interval == 30):
        //Monthly
        //Push in the selected dates in the selected array.
        for (var i = 0; i < between.length; i += 30) {
            selected.push(between[i]);
        }
        break;
    case (interval == 15):
        //Bi-Monthly
        //Push in the selected dates in the selected array.
        for (var i = 1; i < between.length; i += 15) {
            selected.push(between[i]);
        }
        break;
    case (interval == 0):
        //One time event
        //Push in the selected dates in the selected array.
        for (var i = 0; i < 1; i++) {
            selected.push(between[i]);
        }
        break;
    default:
        return undefined;
}

Критерии для определения следующей повторяющейся даты должны быть такими:

Например, пользователь выбирает среду первой недели января, тогда следующей повторяющейся датой должна быть среда первой недели февраля.


person Superman    schedule 11.01.2015    source источник
comment
Каково ваше определение одного и того же дня?   -  person PM 77-1    schedule 11.01.2015
comment
точно... каждую 4-ю среду против 22-го числа каждого месяца. Критерии не ясны   -  person charlietfl    schedule 11.01.2015
comment
@ PM77-1 Например, пользователь выбирает среду первой недели января, тогда следующей повторяющейся датой должна быть среда первой недели февраля.   -  person Superman    schedule 11.01.2015
comment
Я не видел ни одного созданного объекта Date.   -  person Andi N. Dirgantara    schedule 11.01.2015
comment
если вы хотите по средам, они происходят с интервалами 7,14,21,28. Не уверен, что это за осложнение. Количество дней в неделе не меняется   -  person charlietfl    schedule 11.01.2015
comment
@andinugrohodirgantara Я сказал, что он содержит только диапазон выбранных дат. И приведенный выше код относится только к повторяющейся части.   -  person Superman    schedule 11.01.2015
comment
Используйте moment.js, сэкономьте себе много времени и вычислений   -  person charlietfl    schedule 11.01.2015
comment
@charlietfl Даны две даты. даты начала и окончания. Я рассчитал диапазон между этими датами. Теперь, как я могу рассчитать, что в ближайшие месяцы будет 7, 14, 21 и 28, но в заданном диапазоне.   -  person Superman    schedule 11.01.2015
comment
@charlietfl это не имеет к этому никакого отношения. Если тот, кто спрашивает, уже все знает, то это не то место, где он печатает, то это будет его редактор кода. Период.   -  person Superman    schedule 11.01.2015
comment
@charlietfl Пожалуйста, не обращайте внимания, если не можете помочь. Спасибо.   -  person Superman    schedule 11.01.2015
comment
попробуйте использовать while( newDate < end Date)   -  person charlietfl    schedule 11.01.2015
comment
Массив between[] содержит диапазон между этими двумя датами. Следующая вещь, которую вы, к сожалению, не получаете. @charlietfl   -  person Superman    schedule 11.01.2015
comment
но вы увеличиваете, пока условие не станет ложным   -  person charlietfl    schedule 11.01.2015
comment
@Superman: я отредактировал заголовок вашего поста, чтобы он больше соответствовал определению задачи. Кроме того, кажется, что в некоторых случаях решение не может быть найдено, например. если 1 февраля — понедельник, а 1 марта — пятница (при условии, что неделя заканчивается в воскресенье). Спасибо и привет,   -  person Alexander Bell    schedule 11.01.2015
comment
@AlexBell это именно то, что я хочу, большое спасибо за перефразировку.   -  person Superman    schedule 11.01.2015
comment
Пожалуйста. Желаем удачи с вашим проектом. С уважением,   -  person Alexander Bell    schedule 11.01.2015


Ответы (1)


Сначала определите выбранный Date объект.

var between = [new Date(2015, 0, 11), new Date(2015, 0, 20)]

Теперь определяем компонент, который нам нужен. Вот они: когда должна начаться следующая дата.

var start = new Date(between[0].getFullYear(),between[0].getMonth(),between[0].getDate()+27)

это будет начальный день в следующем месяце и тот же «день», который вы описываете.

Оберните его, чтобы он функционировал:

var getNextMonth = function (date, howmany){
  return new Date(date.getFullYear(), date.getMonth(), date.getDate()+28*howmany);
};

var getNextMonthRange = function (between, howmany){
  return [getNextMonth(between[0], howmany), getNextMonth(between[1], howmany)]
};

Пример

var between = [new Date(2015, 0, 11), new Date(2015, 0, 20)]; // Sunday, 11 Jan 2015 to Tuesday, 20 Jan 2015
var nextBetween = getNextMonthRange(between, 1); // Sunday, 8 Feb 2015 to Tuesday, 17 Feb 2015

Я надеюсь, это то, что вы хотите :D

person Andi N. Dirgantara    schedule 11.01.2015
comment
Вы очень хорошо объяснили свой ответ, я очень ценю это. Но это не совсем то, что я спросил. Я думаю, что мое объяснение немного сомнительно, что вы не поняли его правильно. 1. У меня нет проблем с поиском диапазона между двумя датами. 2. Массив between[] выше в моем коде содержит рассчитанный диапазон между двумя датами. 3. Теперь я пытаюсь найти одну и ту же комбинацию дня недели/недели для каждого месяца, заданного в массиве between[]. Если диапазон содержит несколько месяцев. - person Superman; 11.01.2015
comment
Можете ли вы описать случай проблемы в реальном мире? Например, какая переменная у вас уже есть и какой пример вывода вы хотели? - person Andi N. Dirgantara; 11.01.2015
comment
Пожалуйста, посмотрите на журнал, который я создал, каждый календарь показывает даты каждого месяца. Так было с еженедельным повторением. И он отлично работает, просто перебирая массив between[] с интервалом в 7 дней. Теперь я хочу, чтобы ежемесячно и раз в два месяца повторялись даты с учетом того, что первая дата, выбранная пользователем, должна быть выбрана в следующем месяце, пока мы не завершим сканирование всех дат. jsfiddle.net/Superman/72efouLs - person Superman; 11.01.2015
comment
Это то же самое, что я ищу, но в javascript и в пределах диапазона вместо следующих 5 лет. stackoverflow.com/questions/20742822/ - person Superman; 11.01.2015
comment
Подождите, вы хотите в тот же день или дату? Если я выберу воскресенье, 11 января 2015 г., следующий месяц должен быть воскресеньем, 8 февраля 2015 г., или четвергом, 11 февраля 2015 г.? - person Andi N. Dirgantara; 11.01.2015
comment
В тот же день на той же неделе. Скажем. Первая неделя и четверг января, затем первая неделя и четверг февраля должны быть следующей повторяющейся датой. - person Superman; 11.01.2015
comment
Итак, если первая дата — воскресенье, 11 января 2015 г., следующий месяц должен быть воскресеньем, 1 февраля 2015 г.? Не 8 февраля, верно? Если да, то я понял, это можно сделать и с помощью объекта даты, я отредактирую свой ответ. - person Andi N. Dirgantara; 11.01.2015
comment
Нет, следующее будет 8 февраля. Потому что это должна быть та же неделя в следующем месяце. 11 января приходится на 2-ю неделю, поэтому следующий же день должен приходиться на 2-ю неделю следующего месяца. - person Superman; 11.01.2015
comment
Если это так, просто замените i += 30 на i += 28 на месяц :D - person Andi N. Dirgantara; 11.01.2015
comment
Действительно? Подождите, дайте мне проверить. Это не может быть так просто :/ - person Superman; 11.01.2015
comment
В этом есть небольшая проблема. Я дал дату начала 01/06/2015 и дату окончания 04/23/2015 И в марте он выбирает две даты. Один вторник 3 марта, а второй день 31 марта. Это не должно быть две даты в одном месяце. - person Superman; 11.01.2015
comment
Сделанный. :D Я ограничиваю выбор только 1 датой в месяц. - person Superman; 11.01.2015
comment
А раз в два месяца 14 дней? - person Superman; 11.01.2015
comment
Есть проблемы с этим расчетом. Он не уважает неделю, соответственно, он просто считает дни. - person Superman; 11.01.2015
comment
На самом деле вы должны использовать объект Date. У него есть date.getDay(), которые возвращают day in a weeks, а также date.getDate(), которые возвращают day in a month. В сочетании с Math.ceil, как Math.ceil(date/7), он возвращает what weeks is it. - person Andi N. Dirgantara; 11.01.2015
comment
каждый элемент в массиве between[] является объектом даты. - person Superman; 11.01.2015
comment
Если это так, используйте комбинацию с Math.ceil, как я упоминал ранее. Также попробуйте momentjs, возможно, эти библиотеки очень помогут вам при игре с date object. - person Andi N. Dirgantara; 11.01.2015