Javascript:计算租赁的剩余时间(然后是租金)(租金计算器)

标签 javascript

我在一家企业房地产代理公司工作,我正在创建一个内部页面供员工使用,其中仅包含一些小工具供他们使用。

我一直在尝试组合的其中一件事是租金计算器,根据用户的租金金额和租赁到期日期,需要确定租赁的剩余时间(从今天开始),然后告知该租约还需支付多少租金。

我已经让它工作了,大部分,但是正如你所看到的,它相当长(我假设在某种程度上它必须如此)并且我感觉相当困惑:

//calculates the remaining rent left to pay for terminated leases
$("input[name='calcRent']").click(function() {
    //gets rent and daily rent for later calculations
    var rent = $("input[name='rentRent']").val();
    var dailyRate = (rent * 12) / 365;
    var leaseExpiry = $("input[name='leaseExpiry']").val();
    var remRent = $("input[name='remRent']");
    //breaks down lease expiry date and today's date into day, month, year parts
    //so that units can be used in calculations
    var ldd = leaseExpiry.substr(0,2);
        ldd = parseInt(ldd, 10);
    var lmm = leaseExpiry.substr(3,2);
        lmm = parseInt(lmm, 10);
    var lyyyy = leaseExpiry.substr(6,4);
        lyyyy = parseInt(lyyyy, 10);
    var date = new Date();
    var tdd = date.getDate();
    var tmm = date.getMonth()+1;
    var tyyyy = date.getFullYear();
        //if the expiry month is next year (or later) add 12 to expiry
        //month value to make "lmm - tmm" calculation give positive value
        if (lyyyy > tyyyy) {
            lmm += (12 * (lyyyy - tyyyy));
        }
    //takes the current month from the expiry month to get the number of
    //whole months left in the lease, then checks day values to see whether
    //we have already passed the rent due date for this month (and so there's
    //one less whole month left than we originally thought), taking 1 from
    //wholeMths value if so
    var wholeMths = lmm - tmm;
        if (ldd == (tdd - 1)) {
            wholeMths = wholeMths;
        } else if (ldd < (tdd - 1)) {
            wholeMths -= 1;
        }
    //works out if there are any days to be charged at daily rate (i.e. not
    //part of a whole month). If today's date(tdd) == expiry date(ldd)+1 we have no
    //leftover days (rental month runs like so: 12/04 - 11/05). If tdd > ldd+1
    //(leftover days cross over a month end) we set checkMonth to true so the following
    //if statement runs
    var checkMonth = false;
    var daysLeft = 0;
        if (tdd == (ldd + 1)) {
            daysLeft = 0;
        } else if (tdd > ldd + 1) {
            daysLeft = (31 - tdd) + ldd;
            checkMonth = true;
        } else {
            daysLeft = ldd - tdd;
        }
        //as per the above line: "daysLeft = (31 - tdd) + ldd;" we assume months have 31 days
        //as the majority do, this if checks whether the month end that we cross over with our
        //leftover days actually has 30 days, if not we check whether it's February and whether
        //it's a leap year so that we get the appropriate no. of days to charge for - if it meets
        //any of these criteria the relevant no. of days are subtracted from daysLeft
        if ((lmm == 05 || lmm == 07 || lmm == 10 || lmm == 12
            || lmm == 17 || lmm == 19 || lmm == 22 || lmm == 24) && checkMonth) {
            daysLeft -= 1;
        } else if ((lmm == 03 || lmm == 15) && checkMonth) {
            if (lyyyy % 4 == 0) {
                daysLeft -= 2;
            } else {
                daysLeft -= 3;
            }
        }
        checkMonth = false;
    var balance = (wholeMths * rent) + (daysLeft * dailyRate);

    remRent.val(balance.toFixed(2));        
});

特别困扰我的一个问题是租约在接下来的一年到期。我还没有弄清楚如何整齐地处理该月的“值(value)”(正如您在最后的 if 中看到的那样)。

对此的任何建议将不胜感激,因为评论的数量和数量似乎与实际代码有点不成比例 - 但我认为它们目前是必要的,因为目前还不清楚发生了什么。

谢谢

最佳答案

您所做的工作非常出色,但您需要使用 Date 类来利用 JavaScript 中提供的内置日期计算功能。

具体来说,要获取日期之间的天数,您可以使用以下逻辑:

var currentDate = new Date();    // This will get today's date
currentDate.setHours(0,0,0,0);   // Remove time from consideration
                                 // As recommended by @NickSlash

// The following get's the lease expiration date using the year,
// month and date that you have already extracted from the input
var leaseExpirationDate = new Date( lyyyy, lmm, ldd ); 

// The number of days remaining in the lease is simply the following:
var one_day = 1000*60*60*24;
var daysLeftInLease = (leaseExpirationDate - currentDate ) / one_day;

之所以会发生这种神奇的情况,是因为 Date 类在内部将日期值保留为自 1970 年 1 月 1 日以来的毫秒数。因此,如果您减去两个 Date 对象,您将得到它们之间的毫秒数。然后,您只需将该值除以一天中的毫秒数即可获得日期之间的天数。

关于Javascript:计算租赁的剩余时间(然后是租金)(租金计算器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16512410/

相关文章:

javascript - window.open 在 Firefox 55.0.1 上无法正常工作

javascript - crockjs和apply函数需要一个函数作为值

javascript - D3 鼠标事件——单击和拖动结束

javascript - Backbone.js 客户端模型在服务器端错误时保存问题

javascript - 如何删除 javascript 监听器中的重复函数?

javascript - 关于SVG(可缩放矢量图形)的几个问题

javascript - 这个无限滚动的脚本中发生了什么?

javascript - Jquery,从条件中获取 'this' 选择器

javascript - 将导航与 Logo 对齐

javascript - node.js setTimeout() 工作吗?