【问题标题】:Moment.js - Get all mondays between a date rangeMoment.js - 获取日期范围之间的所有星期一
【发布时间】:2017-12-08 03:28:04
【问题描述】:

我的日期范围是这样的

let start = moment(this.absence.FromDate);
let end = moment(this.absence.ToDate);

用户可以决定停用该日期范围内的特定工作日,所以我有布尔值

monday = true;
tuesday = false;
...

我想创建一个函数,允许我将日期范围内的所有星期一放入一个数组中。

我在堆栈上环顾四周,但我只能为需要一个月内所有星期一的人提供帮助。

【问题讨论】:

  • 我想我记得 momentjs() 提供了一个函数 moment().day() ,它为您提供星期几(一个介于 0 和 6 之间的数字)。你可以使用它。

标签: javascript angular typescript momentjs


【解决方案1】:

您可以使用.day(1) 获取下周一,然后循环直到您的日期isBefore 您的end 日期使用add 为每次迭代添加7 天

这是一个现场样本:

//let start = moment(this.absence.FromDate);
//let end = moment(this.absence.ToDate);

// Test values
let start = moment();
let end = moment().add(45 , 'd');

var arr = [];
// Get "next" monday
let tmp = start.clone().day(1);
if( tmp.isAfter(start, 'd') ){
  arr.push(tmp.format('YYYY-MM-DD'));
}
while( tmp.isBefore(end) ){
  tmp.add(7, 'days');
  arr.push(tmp.format('YYYY-MM-DD'));
}
console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>

【讨论】:

  • if( tmp.isAfter(start, 'd') ){ arr.push(tmp.format('YYYY-MM-DD')); } 的意义何在?
  • @ElliotSchep 该部分代码包括某些边缘情况的第一个星期一(例如,start 是星期日或星期一)。显然不是唯一的方法,但我认为这是最简单的方法。
  • 如果开始日期是星期一,它将丢失,因此您需要使用tmp.isSameOrAfter(start, 'd')
  • 一个更正的建议。在循环 While 中,反转 .add() 和 .push()。因为那会在推送被条件检查的日期之前添加 7 天。所以返回一个超过限制日期 7 天的日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-10-29
  • 2011-10-27
  • 1970-01-01
  • 2017-05-02
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
相关资源
最近更新 更多