我查看了其他一些问题,并没有看到我的具体问题,所以如果有人被问到或已经回答,请原谅。
我想要做的是找出一个简单的“付款”计算器,并提供一些额外的信息,例如第一个付款日期和最后一个。
在某些情况下,上次付款的日期有效,有时却没有。
这是我的代码:
var myDate = new Date();
var odo = document.contract.firstPaymentDate.value;
var n = odo.split("/");
var month = n[0];
var day = n[1];
var year = n[2];
var oldDateObj = new Date(year, month, day);
var newDateObj = new Date(oldDateObj.getTime() + ((document.contract.totalNumberRegularPayments.value - 1)*1209600*1000));
var dd = newDateObj.getDate();
var mm = newDateObj.getMonth();
var y = newDateObj.getFullYear();
var someFormattedDate = mm + '/'+ dd + '/'+ y;
document.contract.lastPaymentDate.value = someFormattedDate;
所以我采取第一个付款日期,并将付款次数增加1209600秒(减1,因为他们已经“已经”支付了第一次付款。
这是基于可以由用户选择的特定日期开始。
所以我的例子是156 BiWeekly付款(因此155计算),这可以用到6年。如果我选择1日期,我将以10/01/2013作为开始,但是以9/11/2019作为结束(第一个是周二,最后一个是周三)。
15日(2013年9月15日 - 星期日 - 至2009年8月24日 - 星期六) 对于20日(2013年9月20日 - 星期五 - 至2013年8月29日 - 星期四)
所以,因为有时它是一天之后,有时甚至是前一天,我不能只是+1到var dd = newDateObj.getDate();
对于发生的事情我真的很困惑,我希望那里有人有这方面的经验,或者有人知道我可能做错了什么。
提前感谢您提供的任何帮助。
答案 0 :(得分:10)
如果您想要添加数周,只需添加7倍的天数,例如
var now = new Date();
// Add two weeks
now.setDate(now.getDate() + 14);
因此,如果您每24周付款一次:
var now = new Date();
// Add 24 fortnights (48 weeks)
now.setDate(now.getDate() + 24 * 14);
或
now.setDate(now.getDate() + 24 * 2 * 7);
无论你认为什么都是最清楚的。
如果您想要一个开始和结束日期:
var start = new Date();
var end = new Date(+start);
end.setDate(end.getDate() + 24 * 14);
alert('Start on: ' + start + '.\nEnd in 24 fortnights: ' + end);
这是一个有效的例子:
<script>
function calcLastPayment(start, numPayments) {
if (typeof start == 'string') {
start = stringToDate(start);
}
var end = new Date(+start);
end.setDate(end.getDate() + --numPayments * 14)
return end;
}
// Expect date in US format m/d/y
function stringToDate(s) {
s = s.split(/\D/)
return new Date(s[2], --s[0], s[1])
}
</script>
<form>
<table>
<tr><td>Enter first payment date (m/d/y):
<td><input name="start">
<tr><td>Enter number of payments:
<td><input name="numPayments">
<tr><td colspan="2"><input type="button" value="Calc end date" onclick="
this.form.end.value = calcLastPayment(this.form.start.value, this.form.numPayments.value)
">
<tr><td>Last payment date:
<td><input readonly name="end">
<tr><td colspan="2"><input type="reset">
</table>
</form>
鉴于第一个付款日期为9月5日星期四和3月还款,它将于10月3日星期四返回,这对我来说是正确的(9月5日和19日以及10月3日)。它适用于任何数量的付款。
答案 1 :(得分:0)
有一种简单的方法可以在一行或两行代码中执行此操作。
我使用864e5
表示一天中的毫秒数。因为1000 milliseconds/second * 60 seconds/minute * 60 minutes/hour * 24 hours/day = 86400000 milliseconds/day
或864e5
。
var now = new Date,
day = 864e5,
weekFromNow = new Date(+now + day * 7); //+now casts the date to an integer
+now
将日期转换为整数,即毫秒数。 now.valueOf()
也有效。day * 7
或864e5 * 7
是一周内的毫秒数。new Date(...)
再次将毫秒数转换为日期。有时您不必担心将值重新投射到某个日期。