【问题标题】:How to get all sundays/mondays/tuesdays between two dates? [duplicate]如何获取两个日期之间的所有星期日/星期一/星期二? [复制]
【发布时间】:2017-05-02 20:08:05
【问题描述】:

给定一个开始日期和一个结束日期,我怎样才能得到所有的,例如9 月 1 日至 11 月 2 日之间的星期日?

注意 - 不是重复:我不想要计数,而是将单个日期作为 javascript 日期或 momentjs 对象(答案链接在另一个所以问题是要求 count)

【问题讨论】:

  • 我不知道为什么您的问题被否决并标记为重复。显然不是。

标签: javascript momentjs


【解决方案1】:

使用循环不断获取下周日的日期,直到超过结束日期。

var start = moment('2016-09-01'), // Sept. 1st
    end   = moment('2016-11-02'), // Nov. 2nd
    day   = 0;                    // Sunday

var result = [];
var current = start.clone();

while (current.day(7 + day).isBefore(end)) {
  result.push(current.clone());
}

console.log(result.map(m => m.format('LLLL')));
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>

【讨论】:

  • 使用isSameOrBefore而不是isBefore,否则你会错过这个月的最后一天,可能是周末。
  • @SharvyAhmed 对,如果您希望结果包含结束日期(如果结束日期是星期日),请使用 isSameOrBefore
【解决方案2】:

您可以从开始日期到所需名称的最近日期,然后继续添加 7 天,直到您超过结束日期,例如

/* Given a start date, end date and day name, return
** an array of dates between the two dates for the
** given day inclusive
** @param {Date} start - date to start from
** @param {Date} end - date to end on
** @param {string} dayName - name of day
** @returns {Array} array of Dates
*/
function getDaysBetweenDates(start, end, dayName) {
  var result = [];
  var days = {sun:0,mon:1,tue:2,wed:3,thu:4,fri:5,sat:6};
  var day = days[dayName.toLowerCase().substr(0,3)];
  // Copy start date
  var current = new Date(start);
  // Shift to next of required days
  current.setDate(current.getDate() + (day - current.getDay() + 7) % 7);
  // While less than end date, add dates to result array
  while (current < end) {
    result.push(new Date(+current));
    current.setDate(current.getDate() + 7);
  }
  return result;  
}

// Get Wednesdays between 15 December, 2016 and 25 February, 2017.
console.log(getDaysBetweenDates(
              new Date(2016,11,15),
              new Date(2017,1,25),
              'Wed'));

请注意,默认情况下,SO 控制台将日期打印为 ISO 8601 UTC,因此格林威治以东的用户将看到比预期提前一天的日期。此外,该函数应验证输入,即检查它是否具有有效的开始和结束日期对象以及 dayName 是否有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多