gpt4 book ai didi

javascript - 使用 moment.js 查找给定工作日(即星期一)的下一个实例

转载 作者:行者123 更新时间:2023-12-02 17:18:47 27 4
gpt4 key购买 nike

我想获取下周一或周四的日期(如果是周一或周四,则为今天)。由于 Moment.js 在周日至周六的范围内工作,我必须计算出当前日期并据此计算下周一或周四:

if (moment().format("dddd")=="Sunday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Monday") { var nextDay = moment().day(1); }
if (moment().format("dddd")=="Tuesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Wednesday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Thursday") { var nextDay = moment().day(4); }
if (moment().format("dddd")=="Friday") { var nextDay = moment(.day(8); }
if (moment().format("dddd")=="Saturday") { var nextDay = moment().day(8); }

这可行,但肯定有更好的方法!

最佳答案

这里的技巧不在于使用 Moment 转到今天的某一天。它对其进行了概括,因此您可以在任何一天使用它,无论您在一周中的哪个时间段。

首先,您需要知道您在一周中的位置:moment().day(),或者稍微更可预测的(无论语言环境如何)moment().isoWeekday( )。重要的是,这些方法返回一个整数,这使得您可以轻松地使用比较运算符来确定您在一周中相对于目标的位置。

用它来知道今天是比您想要的日子小还是大。如果它更小/相等,您可以简单地使用本周星期一或星期四的实例...

const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();

if (today <= dayINeed) {
return moment().isoWeekday(dayINeed);
}

但是,如果今天比我们想要的日期大,您希望使用下周的同一天:“下周的星期一”,无论您在本周的哪个位置。简而言之,您希望首先使用 moment().add(1, 'weeks') 进入下周。进入下周后,您可以使用 moment().day(1) 选择所需的日期。

一起:

const dayINeed = 4; // for Thursday
const today = moment().isoWeekday();

// if we haven't yet passed the day of the week that I need:
if (today <= dayINeed) {
// then just give me this week's instance of that day
return moment().isoWeekday(dayINeed);
} else {
// otherwise, give me *next week's* instance of that same day
return moment().add(1, 'weeks').isoWeekday(dayINeed);
}

另请参阅https://stackoverflow.com/a/27305748/800457

<小时/>

编辑:其他评论者指出,OP想要比这更具体的东西:值数组的下一个(“下周一或周四”),而不仅仅是下一个实例某个任意的日子。嗯不错。

通解是总解的开始。我们不是比较一天,而是比较一组天:[1,4]:

const daysINeed = [1,4]; // Monday, Thursday
// we will assume the days are in order for this demo, but inputs should be sanitized and sorted

function isThisInFuture(targetDayNum) {
// param: positive integer for weekday
// returns: matching moment or false
const todayNum = moment().isoWeekday();

if (todayNum <= targetDayNum) {
return moment().isoWeekday(targetDayNum);
}
return false;
}

function findNextInstanceInDaysArray(daysArray) {
// iterate the array of days and find all possible matches
const tests = daysINeed.map(isThisInFuture);

// select the first matching day of this week, ignoring subsequent ones, by finding the first moment object
const thisWeek = tests.find((sample) => {return sample instanceof moment});

// but if there are none, we'll return the first valid day of next week (again, assuming the days are sorted)
return thisWeek || moment().add(1, 'weeks').isoWeekday(daysINeed[0]);;
}
findNextInstanceInDaysArray(daysINeed);

我会注意到,后来的一些海报提供了一个非常精简的解决方案,可以对有效数值数组进行硬编码。如果您总是期望在同一天进行搜索,并且不需要概括其他搜索,那么这将是计算效率更高的解决方案,尽管不是最容易阅读的,并且无法扩展。

关于javascript - 使用 moment.js 查找给定工作日(即星期一)的下一个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34979051/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com