16

我看了一些其他问题,没有看到我的具体问题,所以如果有人问过或回答过,请原谅。

我想做的是找出一个简单的“付款”计算器,并提供一些额外的信息,例如第一个付款日期和最后一个付款日期。

在某些情况下,最后一次付款的日期有效,有时则无效。

这是我的代码:

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 日 - 星期日 - 至 8/24/2019 - 星期六) 20 日(2013 年 9 月 20 日 - 星期五 - 至 2013 年 8 月 29 日 - 星期四)

因此,由于有时会晚一天,有时会提前一天,所以我不能只 +1var dd = newDateObj.getDate();

我真的对发生的事情感到困惑,我希望那里有人对此有一些经验,或者有人知道我可能做错了什么。

提前感谢您提供的任何帮助。

4

2 回答 2

20

如果您想添加周数,只需添加 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 日)。它应该适用于任何数量的付款。

于 2013-09-03T04:55:39.220 回答
1

有一种简单的方法可以在一两行代码中做到这一点。

864e5用于一天中的毫秒数。因为1000 milliseconds/second * 60 seconds/minute * 60 minutes/hour * 24 hours/day = 86400000 milliseconds/day864e5

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(...)再次将毫秒数转换为日期。

有时您不必担心将值转换回日期。

于 2017-04-27T21:09:30.223 回答