Javascript-在一个日期范围内拆分月份金额

Javascript-在一个日期范围内拆分月份金额,javascript,date,Javascript,Date,我想根据每个月的天数在每个月之间平均分配一笔金额。它将有3个输入-开始日期、结束日期和金额。作为回报,我每个月都要分钱 以下是三个例子: 金额=300000 A: start date 9/1/2013 - end date 11/31/2013 September: 300,000 / (30+31+30) * 30 October: 300,000 / (30+31+30) * 31 November: 300,000 / (30+31+30) * 30 B: start date 9/1

我想根据每个月的天数在每个月之间平均分配一笔金额。它将有3个输入-开始日期、结束日期和金额。作为回报,我每个月都要分钱

以下是三个例子:

金额=300000

A:
start date 9/1/2013 - end date 11/31/2013
September: 300,000 / (30+31+30) * 30
October: 300,000 / (30+31+30) * 31
November: 300,000 / (30+31+30) * 30

B:
start date 9/15/2013 - end date 11/30/2013
September: 300,000 / (15+31+30) * 15
October: 300,000 / (15+31+30) * 31
November: 300,000 / (15+31+30) * 30

C:
start date 9/15/2013 - end date 11/15/2013
September: (15+31+15) * 15
October: (15+31+15) * 30
November: (15+31+15) * 15

计算特定月份的金额的数学公式是:(总金额/总天数)*(本月包括天数)

试着只计算接近300天的天数

试试这个:

var dateDif = {
                dateDiff: function(strDate1,strDate2)
                {
                    return (((Date.parse(strDate2))-(Date.parse(strDate1)))/(24*60*60*1000)).toFixed(0);
                }
}


我想到了这个。它起作用了。有什么改进的建议吗

getMonthsBetweenDates : function(s,e) {
    return e.getMonth() - s.getMonth() + (12 * (e.getFullYear() - s.getFullYear())) + 1;
}

diffDays: function(start_date, end_date) {  
    var stop_date = new Date(end_date);
    stop_date.setHours(23);
    stop_date.setMinutes(59);
    stop_date.setSeconds(59);
    return Math.ceil(Math.abs((start_date - stop_date.getTime())/(24*60*60*1000)));
}


var diff_days = util.diffDays(start_date, end_date);
    num_months = util.getMonthsBetweenDates(new Date(start_date), new Date(end_date)),
    splitup_data = new Array(),
    total_budget = data.budget;

var budget_per_day = total_budget / diff_days;

if(num_months > 0) {

    var allotted_budget = 0;

    for(var i=0; i<num_months; i++) {

        start_year_month = new Date(start_date).getFullYear() + '-' + new Date(start_date).getMonth();
        end_year_month = new Date(end_date).getFullYear() + '-' + new Date(end_date).getMonth();                

        temp_date = new Date(start_date);
        temp_date.setMonth(temp_date.getMonth() + i);                       
        tmp_year_month = temp_date.getFullYear() + '-' + temp_date.getMonth();      

        if(tmp_year_month == start_year_month) {
            month_start_date = new Date(start_date); 
            month_end_date = new Date(start_date);                  
            month_end_date.setMonth(month_end_date.getMonth()+1);
            month_end_date.setDate(0);

            month_days = util.diffDays(month_start_date.getTime(), month_end_date.getTime());
            month_budget = Math.round(budget_per_day * month_days);
            allotted_budget+= month_budget;

        } else if(tmp_year_month == end_year_month) {
            month_budget = total_budget - allotted_budget;
        } else {            

            month_start_date = new Date(temp_date.getTime());
            month_end_date = new Date(temp_date.getTime());
            month_start_date.setDate(1);                    
            month_end_date.setMonth(month_end_date.getMonth()+1);
            month_end_date.setDate(0);

            month_days = util.diffDays(month_start_date.getTime(), month_end_date.getTime());
            month_budget = Math.round(budget_per_day * month_days);
            allotted_budget+= month_budget;
        }

        splitup_data.push({            
            "month": temp_date.toYMD(),
            "contracted": month_budget
        });
    }
}       

return splitup_data; 
GetMonthBetweenDates:函数(s,e){
返回e.getMonth()-s.getMonth()+(12*(e.getFullYear()-s.getFullYear())+1;
}
diffDays:函数(开始日期、结束日期){
var停止日期=新日期(结束日期);
停止日期设定时间(23);
停止日期设置分钟数(59);
停止日期设置秒(59);
返回Math.ceil(Math.abs((start_date-stop_date.getTime())/(24*60*60*1000));
}
var diff_days=util.diffDays(开始日期、结束日期);
num_months=util.getMonthsBetweenDates(新日期(开始日期)、新日期(结束日期)),
splitup_data=新数组(),
总预算=data.budget;
var预算/日=总预算/差异日;
如果(月数>0){
分配的var_预算=0;

对于(var i=0;i)和您自己的尝试有多大进展?没有11/31,在您的第一个示例中,10月份不应该比9月和11月多一点,因为它比其他两个多一天?@pawel,抱歉。刚刚更新了帖子
getMonthsBetweenDates : function(s,e) {
    return e.getMonth() - s.getMonth() + (12 * (e.getFullYear() - s.getFullYear())) + 1;
}

diffDays: function(start_date, end_date) {  
    var stop_date = new Date(end_date);
    stop_date.setHours(23);
    stop_date.setMinutes(59);
    stop_date.setSeconds(59);
    return Math.ceil(Math.abs((start_date - stop_date.getTime())/(24*60*60*1000)));
}


var diff_days = util.diffDays(start_date, end_date);
    num_months = util.getMonthsBetweenDates(new Date(start_date), new Date(end_date)),
    splitup_data = new Array(),
    total_budget = data.budget;

var budget_per_day = total_budget / diff_days;

if(num_months > 0) {

    var allotted_budget = 0;

    for(var i=0; i<num_months; i++) {

        start_year_month = new Date(start_date).getFullYear() + '-' + new Date(start_date).getMonth();
        end_year_month = new Date(end_date).getFullYear() + '-' + new Date(end_date).getMonth();                

        temp_date = new Date(start_date);
        temp_date.setMonth(temp_date.getMonth() + i);                       
        tmp_year_month = temp_date.getFullYear() + '-' + temp_date.getMonth();      

        if(tmp_year_month == start_year_month) {
            month_start_date = new Date(start_date); 
            month_end_date = new Date(start_date);                  
            month_end_date.setMonth(month_end_date.getMonth()+1);
            month_end_date.setDate(0);

            month_days = util.diffDays(month_start_date.getTime(), month_end_date.getTime());
            month_budget = Math.round(budget_per_day * month_days);
            allotted_budget+= month_budget;

        } else if(tmp_year_month == end_year_month) {
            month_budget = total_budget - allotted_budget;
        } else {            

            month_start_date = new Date(temp_date.getTime());
            month_end_date = new Date(temp_date.getTime());
            month_start_date.setDate(1);                    
            month_end_date.setMonth(month_end_date.getMonth()+1);
            month_end_date.setDate(0);

            month_days = util.diffDays(month_start_date.getTime(), month_end_date.getTime());
            month_budget = Math.round(budget_per_day * month_days);
            allotted_budget+= month_budget;
        }

        splitup_data.push({            
            "month": temp_date.toYMD(),
            "contracted": month_budget
        });
    }
}       

return splitup_data;