javascript获取某年每月月末

这是一个JavaScript函数,用于根据给定的日期和月份判断该月有多少天。它考虑了闰年的情况,返回值包括28到31不等。函数主要应用于日期计算和验证场景。
let filterEndDate = (date, value) => {
    switch(value) {
        case 2:
            return new Date(date).getFullYear() % 4 == 0 ? 29 : 28;
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            return 31;
        case 4:
        case 6:
        case 9:
        case 11:
            return 30;
    }
}

node.js环境下处理租赁合同中的分期付款计算,根据不同的付款方式(付、季付等)和次表来计算每期应缴的金额,这是我们的免租期填写信息,能不能修改上述代码,将免租期从缴费份中剔除 function calculatePayments(yearTable, paymentMethod, startDate, endDate) { const formatDate = (date) => date.toISOString().slice(0, 10); // 增加合同数(自动处理月末日期) const addContractMonths = (date, months) => { const newDate = new Date(date); newDate.setMonth(newDate.getMonth() + months); // 处理月末情况(如131日+1个=228日) if (newDate.getDate() !== date.getDate()) { newDate.setDate(0); } return newDate; }; // 获取合同次(核心逻辑) const getContractYear = (currentDate) => { const start = new Date(startDate); let year = 1; let compareDate = new Date(start); while (currentDate >= addContractMonths(compareDate, 12)) { year++; compareDate = addContractMonths(compareDate, 12); } return year; }; try { const start = new Date(startDate); const end = new Date(endDate); if (end <= start) throw new Error('合同结束日期需晚于开始日期'); // 获取支付周期配置 const intervals = { '付':1, '季度付':3, '半付':6, '付':12, '一次性付清':0 }; const interval = intervals[paymentMethod]; if (interval === undefined) throw new Error('无效的付款方式'); const payments = []; // 一次性付清处理 if (interval === 0) { let currentDate = new Date(start); let totalRent = 0, totalFee = 0; // 遍历每个合同 while (currentDate < end) { const yearNumber = getContractYear(currentDate); const yearData = yearTable.find(y => y.field_362164842 === yearNumber); if (!yearData) throw new Error(`缺少第${yearNumber}数据`); // 累加当费用 totalRent += yearData.field_362164848 / 12; totalFee += yearData.field_362164847 / 12; // 移动到下个合同 currentDate = addContractMonths(currentDate, 1); } payments.push({ 期数: 1, 缴纳日期: formatDate(start), 租金金额: totalRent.toFixed(2), 管理费金额: totalFee.toFixed(2), 应缴总金额: (totalRent + totalFee).toFixed(2) }); } // 分期付款处理 else { let periodStart = new Date(start); let periodNumber = 1; while (periodStart < end) { const periodEnd = addContractMonths(periodStart, interval); const actualEnd = periodEnd > end ? new Date(end) : periodEnd; let tempDate = new Date(periodStart); let rentTotal = 0, feeTotal = 0; // 遍历本期包含的合同 while (tempDate < actualEnd) { const yearNumber = getContractYear(tempDate); const yearData = yearTable.find(y => y.field_362164842 === yearNumber); if (!yearData) throw new Error(`缺少第${yearNumber}数据`); rentTotal += yearData.field_362164848 / 12; feeTotal += yearData.field_362164847 / 12; tempDate = addContractMonths(tempDate, 1); } payments.push({ 期数: periodNumber++, 缴纳日期: formatDate(periodStart), 租金金额: rentTotal.toFixed(2), 管理费金额: feeTotal.toFixed(2), 应缴总金额: (rentTotal + feeTotal).toFixed(2) }); periodStart = new Date(actualEnd); } } return payments; } catch (error) { console.error('计算错误:', error.message); return []; } } // 使用示例 let examplePayments = calculatePayments( qf_field.{次表$$3744A9EB9$$}, qf_field.{付款方式$$36854C891$$}, qf_field.{合同开始日期$$368B99C7D$$}, qf_field.{合同结束日期$$368B99C7C$$} ); qf_output = { examplePayments };
最新发布
09-05
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值