如何使用javascript每月获得第一个即将到来的星期四?

问题描述

我想做的是获取今天的日期,然后找到该月的第一个星期四,如果该天已经过了这一天,那么获取下个月的第一个星期四的日期。

由于我有点含糊,我将提供一个示例。我们说每月的第一个星期四是5月2日,现在是5月1日。在那种情况下,我想获取那个星期四的日期,因为它是即将到来的日期。但是,可以说是5月13日,这个日期已经过去了,那么我想获得下个月下一个一个星期四的日期。

解决方法

尝试一下

const firstThur = d => {
  const firstThur = new Date(d.getFullYear(),d.getMonth(),1,15,0); // first of the month
  for (let i=1;i<7;i++) {
    if (firstThur.getDay() === 4) break;
    firstThur.setDate(firstThur.getDate()+1)
  }
  return firstThur;
};  


const getThursday = () => {
  const now = new Date();
  now.setHours(15,0); // normalise
  let ft = firstThur(now);
  return now.getTime() <= ft.getDate ? ft : firstThur(new Date(now.getFullYear(),now.getMonth()+1,0))
}; 
console.log(getThursday())

,

您可以为该月的第一天创建一个日期,然后将其移至第一个星期四。针对传入的日期进行测试,如果更早,则获取下个月的第一个星期四。

以下内容假设,如果传入的日期是第一个星期四,则应返回该星期四。它还假定传入的日期的小时数为零,否则,如果它是第一个星期四,它将在下个月返回第一个。

它也将日期设置为第一个星期四,因此不会循环查找日期。

function getFirstThursday(date = new Date()) {
  // Create date for first of month
  let d = new Date(date.getFullYear(),date.getMonth());
  // Set to first Thursday
  d.setDate((12 - d.getDay()) % 7);
  // If before date,get first Thursday of next month
  if (d < date) {
    d.setMonth(d.getMonth() + 1,1);
    return getFirstThursday(d);
  } else {
    return d;
  }
}

// Some tests
let f = d => d.toLocaleString('en-gb',{
  day:'2-digit',weekday:'short',month:'short'
});
[new Date(2020,8,1),//  1 Sep -> 3 Sep
 new Date(2020,2),//  2 Sep -> 3 Sep
 new Date(2020,3),//  3 Sep -> 3 Sep
 new Date(2020,24),// 24 Sep -> 1 Oct
 new Date(2020,9,//  1 Oct -> 1 Oct
 new Date(2020,//  2 Oct -> 5 Nov
 new Date(2020,26),// 26 Oct -> 5 Nov
 new Date(2020,27)  // 27 Oct -> 5 Nov
 ].forEach( d => console.log(
   `${f(d)} => ${f(getFirstThursday(d))}`
 ));

else 块是多余的,第二个返回值可以紧跟 if 之后,但我认为这更清楚了。