例如说我们看日期01/2018 ...
该月有5个星期三,因此我们返回“ 01/17/2018”,因为它属于该月的第3个星期三

但是,如果我们看02/2018 ...
该月有4个星期三,因此我们返回“ 02/14/2018”,因为它属于该月的第二个星期三

中点公式在这里不太起作用(至少我不认为这样)

这是我应该如何计划所有事情的方法,还是有一种更简单的方法?

function returnMidWednesday(month, year){
  //How many days in month
  var daysInMonth = new Date(year,month,0).getDate();

  //How many Wednesdays in that month

  //If Wednesdays total == 4 return 2nd
  //If Wednesdays total == 5 return 3rd
}

最佳答案

考虑到一个月中的某天会像一个月中的第一天一样发生变化,因此该算法不太简单。有28、29、30和31天的月份。最后三个可以有4或5个星期三。

一种算法是:


获取每月第一个星期三的日期
获取当月的天数
从一个月中的几天中减去第一个星期三的日期
如果结果为28或更大,则有第5个星期三,因此请返回第三个
否则,返回第二个


这是一个实现:



/* Return second Wednesday where there are 4 in a month
** Return the third Wednesday where there are 5 in a month
** @param {number} year - year
** @param {number} month - month
** @returns {Date} date of "middle" Wednesday
*/
function getMidWed(year, month) {

  // Create date for first of month
  var d = new Date(year, month - 1);

  // Set to first Wednesday
  d.setDate(d.getDate() + ((10 - d.getDay()) % 7));

  // Get days in month
  var n = new Date(d.getFullYear(), d.getMonth() + 1, 0).getDate();

  // Set to 3rd Wed if 28 or more days left, otherwise 2nd
  d.setDate(d.getDate() + (n - d.getDate() > 27? 14 : 7));

  return d;
}

// Some tests
[[2000,2], [2000,5], [2012,2], [2012,5], [2018,1], [2018,2]].forEach(
  function(a) {
    console.log(getMidWed(a[0], a[1]).toString());
  }
);

07-28 10:00