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

IT技术 javascript momentjs
2021-02-28 05:29:11

我想获取下周一或周四的日期(如果是周一或周四,则为今天)。由于 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); }

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

6个回答

这里的诀窍不是使用 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);

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

你能解释一下,如何计算以前的出现次数吗?例如:从今天开始的前一个星期三?
2021-04-18 05:29:11
将 if 语句缩减为: moment().add(+(today > dayINeed), 'weeks').isoWeekday(dayINeed) 更紧凑,但可能可读性更差。
2021-05-02 05:29:11
我认为它只是moment.substract()代替moment.add()......
2021-05-06 05:29:11

使用时刻获得下一个星期一

moment().startOf('isoWeek').add(1, 'week');
从第 2 版开始@jorisw startOf('week') uses the locale aware week start day.
2021-04-29 05:29:11
这不取决于在所使用的语言环境中哪一天被认为是一周的开始?
2021-05-06 05:29:11
.startOf('isoWeek')ISO 8601条规定,工作日数,从1到7,较周一开始和结束星期日
2021-05-15 05:29:11

moment().day() 会给你一个数字,指的是 day_of_week。

有什么更好的:moment().day(1 + 7)moment().day(4 + 7)将分别给你在下周一,下周四。

查看更多:http : //momentjs.com/docs/#/get-set/day/

不幸的是,情况并非如此。如果今天是 26 号星期二, moment().day(1) 将返回星期一 25th - moment().day(8) 返回下星期一。
2021-04-25 05:29:11
整个星期一都有效
2021-04-29 05:29:11

以下可用于从现在(或任何日期)获取下一个工作日的日期

var weekDayToFind = moment().day('Monday').weekday(); //change to searched day name

var searchDate = moment(); //now or change to any date
while (searchDate.weekday() !== weekDayToFind){ 
  searchDate.add(1, 'day'); 
}

这些答案中的大多数都没有解决 OP 的问题。Andrejs Kuzmins 是最好的,但我会改进它一点,以便算法考虑语言环境。

var nextMoOrTh = moment().isoWeekday([1,4,4,4,8,8,8][moment().isoWeekday()-1]);
这是一种超级高效的单线,可能是完成这项工作的最快方式(只要我们不需要搜索不同的日子,或概括解决方案)。
2021-05-07 05:29:11