javascript - 如何仅获取两个给定日期之间该月最后一天出现在星期一的日期

标签 javascript date

返回值应该是一个类似“10/31/2016 8/31/2017”的字符串。此函数返回一年中的所有星期一,但我只需要每个月最后一个星期一的日期(如果它们是该月的最后一天)。

function getMondays(startYear, endYear) {
  const startDate = new Date(startYear, 0, 2)
  const endDate = new Date(endYear, 11, 32)

  var i = startDate,
  month = i.getYear(),
  mondaysOfYear = []

  while (i.getDay() !== 2) {
  i.setDate(i.getDate() + 1)
  }

  while (i.getYear() === month) {
    mondaysOfYear.push(new Date(i.getTime()))
    i.setDate(i.getDate() + 7)
  }
  return mondaysOfYear
}
getMondays(2017, 2017)

最佳答案

你的逻辑似乎不合适。有:

month = i.getYear(),

getYear 返回一个 2 位数的年份,将其分配给一个名为“month”的变量似乎并不明智。然后:

while (i.getDay() !== 2) {
  i.setDate(i.getDate() + 1)
}

将增加日期直到 getDay 返回 2,即星期二。然后:

if (i.getMonth() != prevMonth) mondaysOfYear.push(prevDate);

对我来说没有任何意义。我猜你的算法是将日期设置为星期一,然后添加周数,如果它在月底结束,请保存它。但是你没有那样实现它。

一个更简单且可能更快的算法是从开始到结束获取每个月的最后一天,如果是星期一,则将其推送到数组。有很多方法可以做到这一点,这里是一个。

function getMondays(startYear, endYear) {
  // Set start to 1 Jan of start year
  var start = new Date(startYear, 0);
  // Set end to 31 Dec of end year
  var end = new Date(endYear, 11,31);
  var mondays = [];
  
  do {
    // setDate to end of month 
    start.setMonth(start.getMonth() + 1, 0);

    // If it's a Monday, store it in US mm/dd/yyyy format
    if (start.getDay() == 1) {
      mondays.push(start.toLocaleString('en-us', {
        year:  'numeric',
        month: '2-digit',
        day:   '2-digit'
      }));
    }

    // Set date to start of next month
    start.setDate(start.getDate() + 1);
  } while (start <= end) 
 
  return mondays;
}

console.log( getMondays(2016,2017) );

关于javascript - 如何仅获取两个给定日期之间该月最后一天出现在星期一的日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45535712/

相关文章:

javascript - 如何告诉 webpack 额外的依赖?

mongodb - 如何在mongodb中转换日期格式

shell - 如何使用今天的日期重命名现有文件

javascript google maps Geocoder 调用函数在被调用函数之前结束

javascript - 如何在 JavaScript 中 5 秒后只刷新一次页面?

javascript - 同一域链接正在顶部 iFrame 中加载,而不是在整个页面上加载

javascript - 名称为 div 数据值的函数

java - 在 JMeter 中测试发送和接收日期

unix - 日期的 cron 语法

android - 如何使用 Textview 中的日期和时间设置警报管理器