Как получить дни, недели и месяцы между двумя конкретными датами, указанными с помощью NodeJS? - PullRequest
0 голосов
/ 11 декабря 2018

Я работаю над системой управления кредитами, использующей NodeJS для Back-end и AngularJS для front-end.Просто это то, что мне нужно сделать.

В системе 3 категории.

  1. Ежедневные займы
  2. Еженедельные займы
  3. Ежемесячные займы

Сумма кредита составляет $5000, а это Weekly loan.Это означает, что клиент должен платить по кредиту еженедельно.

Дата начала 2018-12-11 (11 декабря 2018)

Дата окончания 2019-05-11 (11 апреля 2019)

Процентная ставка составляет 8%.

Я хочу найти все недели между начальной и конечной датой.А также сегодня вторник и каждый вторник недели, клиент должен сделать платеж.Поэтому мне нужно сохранить этот список выплат при добавлении нового кредита.

Просто я хочу посчитать 7 дней с 2018-12-11 до 2019-05-11.И специально нам нужно пропустить праздники.Это сохраняется в системе.Когда мы вычисляем даты, мы можем проверить это из списка праздников и пропустить их.

Это пример выходных данных, которые я хочу:

Дата: 2018-12-11, сумма: $ xx

Дата: 2018-12-18, Сумма: $ xx

Дата: 2018-12-25, Сумма: $ xx

Дата: 2019-01-01, сумма: $ xx

Дата: 2019-01-08, сумма: $ xx

Дата: 2019-01-15, сумма: $ xx.,,

То, что я пробовал далеко.

Я пытался использовать https://momentjs.com/ и пытался получить недели примерно так:

moment().add(10, 'days').calendar(); -> Из этого мы можем добавитьвсе даты и получить дату через 10 дней.

А также я использовал https://github.com/datejs/Datejs для этого и до сих пор не смог зациклить все даты.

1 Ответ

0 голосов
/ 11 декабря 2018

Вы можете использовать moment модуль в NodeJS.

npm i moment

Он имеет функцию .diff из документов:

//moment().diff(Moment|String|Number|Date|Array);
//moment().diff(Moment|String|Number|Date|Array, String);
//moment().diff(Moment|String|Number|Date|Array, String, Boolean);

var a = moment([2007, 0, 29]);
var b = moment([2007, 0, 28]);
a.diff(b, 'days') // 1

РЕДАКТИРОВАТЬ:
Таким образом, в основном, вы хотите до +7 дней без учета выходных.

Ниже приведено очень простое решение на основе цикла.Но есть библиотеки, которые делают то, что вы хотите.

const start = moment().startOf('day');
const end = moment(somedate).startOf('day');
let current = start;
const holidayList = [[2018, 11, 25]]
while(current.isSameOrBefore(end)){
    let nextWeek = moment(current).add(7, 'days');
    //check if holidays are between nextWeek and current
    //get number of holidays
    const number_of_holidays = holidayList.reduce((p,c)=>{
        if(moment(c).isAfter(current) && moment(c).isSameOrBefore(nextWeek)){
            return p+1;
        }
        return p;
    },0)
    nextWeek = nextWeek.add(number_of_holidays, 'days')
    //do something
    console.log('---'+nextWeek.toDate());
    current = nextWeek;
}

Вы можете оформить заказ momentjs-business или moment-weekday-calc .

Edit 2: Из вопроса о github я вижу, что вам нужны только вторники, без выходных.

const end = moment(endDate).startOf('day');
const holidayList = [[2018, 11, 25]]
const dayINeed = 2; //for tuesday
let current = moment().isoWeekday();
if (current <= dayINeed) { 
    current = moment().isoWeekday(dayINeed).startOf('day');
} else {
    current = moment().add(1, 'weeks').isoWeekday(dayINeed).startOf('day');
}
while(current.isSameOrBefore(end)){
    /* HERE check for holiday */
    console.log(current.toArray());
    current.add(1, 'weeks');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...