首页 > 解决方案 > 如何获取使用 NodeJS 给出的两个特定日期之间的天数、周数和月数?

问题描述

我正在开发一个贷款管理系统,后端使用 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这个,但仍然没有办法循环所有日期。

标签: javascriptnode.jsdatecalendar

解决方案


您可以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-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');
}

推荐阅读