gpt4 book ai didi

javascript - 使用 Moment.js 获取指定日期之后的特定工作日的日期

转载 作者:行者123 更新时间:2023-12-04 18:01:19 24 4
gpt4 key购买 nike

我正在尝试获取给定日期之后下一个工作日实例的日期。工作日可以是从星期一到星期日的任何一天。我正在使用 Moment.js 库,但似乎没有一种简单的方法可以实现我所追求的目标。

这是我目前所拥有的,但它没有返回我想要的日期:

// competition.startDate = 2016-02-10 (Wednesday)
var startDate = moment(competition.startDate);

...

for (m = 0; m < matchesPerRound; m++) {
var date;

...

// matchTime[m].day = 3 (Wednesday)
date = startDate.startOf('week').add(7, 'days').subtract(matchTime[m].day, 'days');

console.log(date.format('YYYY-MM-DD'));
// Actual Output = 2016-02-11
// Expected Output = 2016-02-10
...

}

对于上面的例子,我需要它返回 2016-02-15因为这是 2016-02-10 之后的下一个星期一.这没问题,我可以得到那个日期。我的问题是我需要更动态的东西,如 matchTime[m].day可以是任何工作日的数字。例如,如果 matchTime[m].day = 3 // Wednesday ,它应该只返回相同的开始日期 2016-02-10因为今天是星期三。

我尽量避免条件语句,但我想知道 Moment.js 是否具有开箱即用的功能来产生这些结果。

更新

我想出了一个解决方案,它符合我的要求,但我觉得它很乱。是否有人有更简洁、更简洁的解决方案?

var date;
var startDate = moment(competition.startDate);
var proposedDate = moment(startDate).startOf('isoweek').add(matchTimes[0].day - 1, 'd');
if ( startDate.isAfter(proposedDate) ) {
date = startDate.startOf('isoweek').add(7 + Number(matchTimes[0].day) - 1, 'd');
} else {
date = startDate.startOf('isoweek').add(matchTimes[0].day - 1, 'd');
}

最佳答案

我不知道 moment.js,但对于相当简单的事情来说它似乎相当复杂。

function firstMatchingDayOfWeek(day, date) {
var delta = date.getDay() - day,
result = new Date(date);

if (delta) {
result.setDate(result.getDate() + ((7 - delta) % 7));
}

return result;
}

我认为代码是不言自明的(我们不都是 ;-)),但为了阐明步骤:

  • firstMatchingDayOfWeek(day, date) > 调用指定星期几 (0-6) 和日期对象的函数
  • delta = date.getDay() - day > 计算日期需要移动多少天才能到达一周中的同一天
  • result = new Date(date) > 根据输入创建一个新的 Date 实例(这样您就可以保留原始日期)
  • result.setDate(result.getDate() + ((7 - delta) % 7)) > 将 date 部分(日期)设置为一周减去 delta,以一周为模(因为 delta 可以是负数,而您希望同一天第一次出现)

function firstMatchingDayOfWeek(day, date) {
var delta = date.getDay() - day,
result = new Date(date);

if (delta) {
result.setDate(result.getDate() + ((7 - delta) % 7));
}

return result;
}



// tests
for (var i = 1; i < 28; ++i){
var check = new Date('2016-02-' + ('00' + i).substr(-2)),
output = document.querySelector('#out')
.appendChild(document.createElement('pre')),
log = [];

log.push('input: ' + check);

for (var day = 0; day <= 6; ++day) {
var next = firstMatchingDayOfWeek(day, check);

log.push(day + ' > ' + next);
}
output.innerText = log.join('\n');
}
pre {
border: 1px solid gold;
}
<div id="out"></div>

关于javascript - 使用 Moment.js 获取指定日期之后的特定工作日的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34972939/

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