【问题标题】:Javascript date loop missing out some months [duplicate]Javascript日期循环错过了几个月[重复]
【发布时间】:2020-11-17 23:15:43
【问题描述】:

嗨,当输入在日期 (29,30,31) 时,我通过循环和丢失几个月来进行摊销

这是我的一些代码:

if (vm.amortisasirequest.pR_StartDate != vm.amortisasirequest.pR_MaturityDate) {
                    var startdate = new Date(vm.amortisasirequest.pR_StartDate);
                    var endate = new Date(vm.amortisasirequest.pR_MaturityDate);
                    vm.kartuAmortisasi = [];
                    if (endate.getFullYear() == startdate.getFullYear()) {
                        jumbulan = endate.getMonth() - startdate.getMonth();
                    } else if (endate.getFullYear() > startdate.getFullYear()) {
                        jumbulan = (endate.getMonth() + ((endate.getFullYear() - startdate.getFullYear()) * 12)) - startdate.getMonth();
                    }
                    vm.totalBeban = vm.amortisasirequest.pO_TotalPurchase / 0.8; //+ (20 / 100 * vm.amortisasirequest.pO_NominalBarang)
                    vm.bebanperbulan = parseFloat(vm.totalBeban / jumbulan).toFixed(2);
                    vm.beban = vm.bebanperbulan;
                    vm.bebanPertamax = vm.beban;
                    var j = 0;
                    var dateNow = new Date();

                    for (var i = 0; i <= jumbulan; i++) {
                        var nextMonth = angular.copy(loopdate);
                        nextMonth.setMonth(nextMonth.getMonth() + 1);

                        if (nextMonth < dateNow) { 
                            vm.beban = parseFloat(vm.beban) + parseFloat(vm.bebanperbulan);
                            vm.beban = parseFloat(vm.beban).toFixed(2);
                            vm.bebanPertamax = vm.beban;
                        }

                        else {
                            // Periode Terakhir
                            if (i == jumbulan) {
                                vm.totalAmor = 0;
                                for (var k = 0; k < vm.kartuAmortisasi.length; k++) {
                                    vm.totalAmor = vm.totalAmor + parseFloat(vm.kartuAmortisasi[k].amortizeAmount);
                                }
                                vm.beban = vm.totalBeban - vm.totalAmor;
                            }
                            vm.kartuAmortisasi.push({ periode: j + 1, valueDate: angular.copy(loopdate), amortizeAmount: parseFloat(vm.beban).toFixed(2) });
                            if (j == 0)
                                vm.kartuAmortisasi[0].isProceed = true;
                            vm.beban = vm.bebanperbulan;
                            //vm.beban = parseFloat(vm.beban).toFixed(2);
                            j++;
                        }
                        loopdate.setMonth(loopdate.getMonth() + 1);
                    }

                    vm.amortisasirequest.listKartuAmortisasi = vm.kartuAmortisasi;

                    vm.amortisasirequest.pO_NilaiBuku = parseFloat(vm.totalBeban) - parseFloat(vm.bebanPertamax);

                    vm.amortisasirequest.jurnalDetail = [];

                    AmortisasiRequestService.processJurnalOtomatis({ poNo: vm.selectedPurchaseOrder.poId, narrative: vm.amortisasirequest.requestId }).then(function (data) {
                        for (var i = 0; i < data.data.length; i++) {
                            data.data[i].amount = vm.bebanPertamax;
                            vm.amortisasirequest.jurnalDetail.push(data.data[i]);
                        }
                        vm.refreshData();
                    });
                }
            })

大部分包含空月份的数据都在二月,在二月循环跳过:

我应该改变什么?

【问题讨论】:

  • 你能把问题简化一点吗?
  • 您可以使用我编写的代码:function addMonth(dt, dom) { var nextMonth=new Date(dt); nextMonth.setMonth(nextMonth.getMonth()+1); nextMonth.setDate(dom); while( (12+nextMonth.getMonth())%12 &gt; (12+dt.getMonth()+1)%12) { nextMonth.setDate(nextMonth.getDate()-1); } return nextMonth; } dt 是起始月份,dom 是起始日期。 addMonth 返回后,检查是否仍在范围内(如果超过,但未命中成熟度 - 添加成熟度)。您需要传递有效的dt(日期对象)和dom(正整数1-31)。

标签: javascript date


【解决方案1】:

由于您从 11 月 30 日开始并逐月继续,直到 1 月 30 日,“下个月”计算为与 3 月重叠的“2 月 30 日”...

示例代码:

const date = new Date('Jan 30, 2020 00:00:01');
console.log(date.getMonth()); // (January gives 0)
date.setMonth(date.getMonth() + 1); 
console.log(date.getMonth());// (gives 2 == March)

【讨论】:

    猜你喜欢
    • 2013-09-21
    • 2015-03-12
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多