如何获得 javascript 中每个月的第一个星期四?
How do I get the first upcoming thursday in everymonth in javascript?
我想做的是获取今天的日期,然后找到该月的第一个星期四,如果那天已经过去了,则获取下个月的第一个星期四的日期。
由于我有点含糊,我将提供一个示例。假设该月的第一个星期四是 5 月 2 日,现在是 5 月 1 日。在那种情况下,我想知道那个星期四的日期,因为它是即将到来的星期四。但是假设是 5 月 13 日,那个日期已经过去了,那么我想得到下个月的第一个星期四的日期。
试试这个
const firstThur = d => {
const firstThur = new Date(d.getFullYear(),d.getMonth(),1,15,0,0,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,0,0); // normalise
let ft = firstThur(now);
return now.getTime() <= ft.getDate ? ft : firstThur(new Date(now.getFullYear(),now.getMonth()+1,1,15,0,0,0))
};
console.log(getThursday())
您可以为每月的第一天创建一个日期,然后将其移至第一个星期四。根据传入的日期对其进行测试,如果它更早,则获取下个月的第一个星期四。
下面假设如果传入的日期是第一个星期四,则应该return编辑那个星期四。它还假定传入日期的小时数已归零,否则如果它是第一个星期四,它将 return 下个月的第一个星期四。
它也只是将日期设置为第一个星期四,因此无需循环查找日期。
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,8, 2), // 2 Sep -> 3 Sep
new Date(2020,8, 3), // 3 Sep -> 3 Sep
new Date(2020,8,24), // 24 Sep -> 1 Oct
new Date(2020,9, 1), // 1 Oct -> 1 Oct
new Date(2020,9, 2), // 2 Oct -> 5 Nov
new Date(2020,9,26), // 26 Oct -> 5 Nov
new Date(2020,9,27) // 27 Oct -> 5 Nov
].forEach( d => console.log(
`${f(d)} => ${f(getFirstThursday(d))}`
));
else 块是多余的,第二个 return 可以紧跟在 if 之后,但我认为它使事情更清楚.
我想做的是获取今天的日期,然后找到该月的第一个星期四,如果那天已经过去了,则获取下个月的第一个星期四的日期。
由于我有点含糊,我将提供一个示例。假设该月的第一个星期四是 5 月 2 日,现在是 5 月 1 日。在那种情况下,我想知道那个星期四的日期,因为它是即将到来的星期四。但是假设是 5 月 13 日,那个日期已经过去了,那么我想得到下个月的第一个星期四的日期。
试试这个
const firstThur = d => {
const firstThur = new Date(d.getFullYear(),d.getMonth(),1,15,0,0,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,0,0); // normalise
let ft = firstThur(now);
return now.getTime() <= ft.getDate ? ft : firstThur(new Date(now.getFullYear(),now.getMonth()+1,1,15,0,0,0))
};
console.log(getThursday())
您可以为每月的第一天创建一个日期,然后将其移至第一个星期四。根据传入的日期对其进行测试,如果它更早,则获取下个月的第一个星期四。
下面假设如果传入的日期是第一个星期四,则应该return编辑那个星期四。它还假定传入日期的小时数已归零,否则如果它是第一个星期四,它将 return 下个月的第一个星期四。
它也只是将日期设置为第一个星期四,因此无需循环查找日期。
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,8, 2), // 2 Sep -> 3 Sep
new Date(2020,8, 3), // 3 Sep -> 3 Sep
new Date(2020,8,24), // 24 Sep -> 1 Oct
new Date(2020,9, 1), // 1 Oct -> 1 Oct
new Date(2020,9, 2), // 2 Oct -> 5 Nov
new Date(2020,9,26), // 26 Oct -> 5 Nov
new Date(2020,9,27) // 27 Oct -> 5 Nov
].forEach( d => console.log(
`${f(d)} => ${f(getFirstThursday(d))}`
));
else 块是多余的,第二个 return 可以紧跟在 if 之后,但我认为它使事情更清楚.