如何获得使用NodeJS给出的两个特定日期之间的天,周和月?

时间:2018-12-11 11:00:42

标签: javascript node.js date calendar

我正在开发一个贷款管理系统,使用NodeJS作为后端,而AngularJS作为前端。简单地,这就是我需要做的。

系统中有3个类别。

  1. 每日贷款
  2. 每周贷款
  3. 每月贷款

贷款金额为$5000,这是Weekly loan。这意味着客户需要每周偿还这笔贷款。

开始日期是2018-12-11(2018年12月11日)

结束日期为2019-05-11(2019年4月11日)

利率为8%

我想做的是,找到开始日期和结束日期之间的所有星期。 今天也是星期二,每周的每个星期二,客户都需要付款。因此,在添加新贷款时,我需要保存该还款清单。

我想算一下从2018-12-11到2019-05-11的7天。特别是我们需要跳过假期。它被保存在系统中。在计算日期时,我们可以从假期列表中检查日期并跳过它们。

这是我想要的示例输出:

日期: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 :(得分:2)

您可以在NodeJS中使用moment模块。

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-businessmoment-weekday-calc

编辑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');
}
相关问题