Javascript-在一个日期范围内拆分月份金额
我想根据每个月的天数在每个月之间平均分配一笔金额。它将有3个输入-开始日期、结束日期和金额。作为回报,我每个月都要分钱 以下是三个例子: 金额=300000Javascript-在一个日期范围内拆分月份金额,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
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;