日期递增无法按预期在javascript中起作用

时间:2019-04-29 09:18:05

标签: javascript

使用javascript增加日期无法正常工作。

该功能以前运行良好,但我不知道为什么现在不起作用。

实际结果:
4月30日星期二
5月1日星期三
6月1日星期六
7月03日,周三
8月03日星期六
9月04日星期三
星期日,十月06

预期:
4月30日星期二
5月1日星期三
5月2日,周四
5月03日星期五
5月04日星期六
5月5日星期日
星期一,五月06

var dt = new Date();
var nextDay = new Date(dt);
nextDay.setDate(dt.getDate() + 1);

document.getElementById("datetime1").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 2);
document.getElementById("datetime2").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 3);
document.getElementById("datetime3").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 4);
document.getElementById("datetime4").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 5);
document.getElementById("datetime5").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 6);
document.getElementById("datetime6").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 7);
document.getElementById("datetime7").innerHTML = ("0" + nextDay).substring(1, 12);
nextDay.setDate(dt.getDate() + 8);
pre {
    display: block;
    unicode-bidi: embed;
    font-family: monospace;
    white-space: pre;
}
<pre id="datetime1"></pre>
<pre id="datetime2"></pre>
<pre id="datetime3"></pre>
<pre id="datetime4"></pre>
<pre id="datetime5"></pre>
<pre id="datetime6"></pre>
<pre id="datetime7"></pre>

2 个答案:

答案 0 :(得分:1)

基本问题是您基于nextDay更新了dt

nextDay.setDate(dt.getDate() + 1);

可能会更改其月份,然后再次重复执行:

nextDay.setDate(dt.getDate() + 2);

所以:

  • nextDay.setDate(dt.getDate() + 1);:将4月29日定为30天,将其定为4月30日。
  • nextDay.setDate(dt.getDate() + 2);:将4月30日定为31日,即5月1日(4月只有30天)
  • nextDay.setDate(dt.getDate() + 3);:将5月1日设置为第32天,使其成为6月1日(可能只有31天)
  • nextDay.setDate(dt.getDate() + 4);:将第33天设置为6月1日,即7月3日(6月只有30天)

...等等。将dt.getDate()nextDay.setDate混在一起会让您大跌眼镜,因为dt停留在四月,而nextDay移到下个月。

相反,只需更新同一日期实例,将其向前移动1,并使用循环而不是重复自己:

var dt = new Date();
var nextDay = new Date(+dt);

for (var n = 1; n <= 7; ++n) {
    nextDay.setDate(nextDay.getDate() + 1);
    document.getElementById("datetime" + n).innerHTML = ("0" + nextDay).substring(1, 12);
}
pre {
    display: block;
    unicode-bidi: embed;
    font-family: monospace;
    white-space: pre;
}
<pre id="datetime1"></pre>
<pre id="datetime2"></pre>
<pre id="datetime3"></pre>
<pre id="datetime4"></pre>
<pre id="datetime5"></pre>
<pre id="datetime6"></pre>
<pre id="datetime7"></pre>


旁注:

var nextDay = new Date(dt);

不是克隆日期的可靠方法。它可以在某些JavaScript引擎上工作,但不能在其他引擎上工作。要可靠地克隆日期,请使用getTime(或一元+)中的毫秒值(自Epoch):

var nextDay = new Date(dt.getTime());
// or
var nextDay = new Date(+dt);

我已经在上面完成了


注释2:

("0" + nextDay).substring(1, 12);是一种将日期转换为字符串的奇怪方法。我可能会改用String(nextDay).substring(0, 11)或日期格式化库。

答案 1 :(得分:-1)

代替

FROM

您可以尝试

nextDay.setDate(dt.getDate() + 3);