Javascript - 在一个循环中,在正确的6个月后添加1周到目前的对象行为不端

Gnu*_*bie 3 javascript date object increment

此Javascript为每个星期日生成一年的演讲者列表.它始于2015年5月3日,并且在2015年11月1日之前是正确的.当一周添加到2015年11月1日时,它将生成2015年11月7日而不是2015年11月8日(在Firefox,IE和Opera中).我做错了什么?输出如下:... 2015年10月25日Delta(OK)2015年11月1日Alpha(OK)2015年11月7日Bravo(错误 - 见输出)

<!DOCTYPE HTML>
<html>
<head>
<title>Speaker List Generator</title>
<meta charset="utf-8">

<script>
'use strict';
// Handy faux constants
var MINUTE = 60 * 1000;
var HOUR =   MINUTE * 60;
var DAY =    HOUR   * 24;
var WEEK =   DAY    *  7;

var month_str = new Array('Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec');

var speakers = new Array();
speakers[0]  = new Array();
speakers = [['Alpha','#FFFAAE'],['Bravo','#FFE3CD'],['Charlie','#AEFFB3'],['Delta','#D2FFFF'],['Echo','#EDEDED']];

// Initialize first date to May 3rd, 2015
var date_obj = new Date('May 3, 2015');
var d = date_obj.getDate();
var m = month_str[date_obj.getMonth()];
var y = date_obj.getFullYear();
var day = '';
</script>
</head>

<body style='font-family:courier'>

<h3>Speaker List</h3>
<table>
<tr>
  <th>Date</th><th>Speaker</th>
</tr>
<script>
// For each month
for (var j = 0; j < 8; j++) {
  // For each speaker
  for (var i = 0; i < speakers.length; i++) {
    // Echo only speaks on a 5th Sunday.
    // If Echo comes up, check for 1st Sunday.
    if ((speakers[i][0] == 'Echo') && (d < 8)) {
      continue;
    }
    // Add a space to 1 digit days
    day = (d < 10)?'&nbsp;'+d:d;
    document.writeln();
    document.writeln("  <tr>");
    document.writeln("    <td>"+day+"-"+m+"-"+y+"</td><td>"+speakers[i][0]+"</td>");
    document.writeln("  </tr>");

    // Add a week to the date for the next round.
    date_obj.setTime(date_obj.getTime() + WEEK);

    // Get next d, m, and y
    d = date_obj.getDate();
    m = month_str[date_obj.getMonth()];
    y = date_obj.getFullYear();
  }
}
</script>
</table>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

T.J*_*der 5

当您跨越夏令时时间边界时,您添加一周的方式将失败,因为您正在添加24小时,但有些天有23小时,有些有25天.

您可以通过设置来避免这种情况.更改

date_obj.setTime(date_obj.getTime() + WEEK);
Run Code Online (Sandbox Code Playgroud)

date_obj.setDate(date_obj.getDate() + 7);
Run Code Online (Sandbox Code Playgroud)

不要担心包裹到下个月,该Date对象将为您做到这一点.