查找每月的第一个星期一日期

时间:2021-07-29 09:53:45

标签: javascript

我有一个日期(通常是一个月的第一天,但​​不是必须的,它可以是任何日期)并且我想要一个对应于该月第一个星期一的新日期。

示例:

findFirstMonday('1 jul 2021') -> 7 jul 2021
findFirstMonday('1 aug 2021') -> 2 aug 2021
findFirstMonday('13 aug 2021') -> 2 aug 2021

这是我的代码不起作用:

const selectedDate = new Date();

const daysInSelectedDate = daysInMonth(selectedDate);
const lastDayPreviousMonth = addDays(selectedDate, daysInSelectedDate - selectedDate.getDate() + 1);
const firstDayPreviousMonth = removeDays(
  lastDayPreviousMonth,
  daysInMonth(lastDayPreviousMonth),
);
console.log('firstDayPreviousMonth: ', firstDayPreviousMonth);
let firstMonday = firstDayPreviousMonth;
while (firstDayPreviousMonth.getDay() !== 1) {
  console.log('firstMonday: ', firstMonday, firstMonday.getDay());
  firstMonday.setDate(firstMonday.getDate() + 1);
}
console.log('firstMonday: ', firstMonday, firstMonday.getDay());

function addDays(date, days) {
  const result = new Date(date)
  result.setDate(result.getDate() + days)
  return result
}

function removeDays(date, days) {
  const result = new Date(date)
  result.setDate(result.getDate() - days)
  return result
}

function daysInMonth(date) {
  return new Date(date.getFullYear(), date.getMonth(), 0).getDate()
}

我怎么了? 非常感谢

2 个答案:

答案 0 :(得分:3)

我想出了以下代码。关于总体思路的一些说明:

  1. 对于给定日期,获取给定日期所在月份的第一个日期。通过使用 day = 1 和给定日期的年和月生成一个新的 Date 对象,这很容易。
  2. 获取第一次约会的工作日。
  3. 根据第一个日期的工作日,您必须计算第一个星期一的日期。此数字由 ((8 - firstWeekdayInMonth) % 7) 计算。您可以轻松地验证自己,这总是会产生星期一。模数对于星期日和星期一很重要,否则您将分别添加 8 和 7,这将不再产生第一个星期一。

console.log(findFirstMonday('1 jul 21'))
console.log(findFirstMonday('1 aug 21'))
console.log(findFirstMonday('13 aug 21'))

function findFirstMonday(dateString) {
  let targetDate = new Date(dateString);
  let targetMonth = targetDate.getMonth();
  let targetYear = targetDate.getFullYear();
  let firstDateInMonth = new Date(targetYear, targetMonth, 1);
  let firstWeekdayInMonth = firstDateInMonth.getDay();
  let firstMondayDate = 1 + ((8 - firstWeekdayInMonth) % 7);
  return new Date(targetYear, targetMonth, firstMondayDate).toLocaleDateString();
}

答案 1 :(得分:2)

编辑

    console.log(findFirstMondayMonth('1 jul 2021').toLocaleDateString())
    console.log(findFirstMondayMonth('1 aug 2021').toLocaleDateString())
    console.log(findFirstMondayMonth('2 aug 2021').toLocaleDateString())
    console.log(findFirstMondayMonth('13 aug 2021').toLocaleDateString())

    function findFirstMonday(dateString) {
      let date = new Date(dateString)
      let diffDay = date.getDay() - 1
      if (diffDay == -1) {
        diffDay = 6
      }
      let mondayDate = new Date(dateString);
      mondayDate.setHours(mondayDate.getHours() - diffDay*24)
      return mondayDate
    }
    
    function findFirstMondayMonth(dateString) {
      let date = new Date(dateString)
      if (date.getMonth() == findFirstMonday(date).getMonth()) {
        let dateOneWeekBefore = new Date(dateString)
        dateOneWeekBefore.setHours(dateOneWeekBefore.getHours() - 24 * 7)
        if (date.getMonth() == dateOneWeekBefore.getMonth()) {
          return findFirstMondayMonth(dateOneWeekBefore)
        } else {
          return findFirstMonday(date)
        }
        
      } else {
        let dateOneWeekAfter = new Date(dateString)
        dateOneWeekAfter.setHours(dateOneWeekAfter.getHours() + 24 * 7)
        return findFirstMonday(dateOneWeekAfter)
      }
    }

抱歉最后一个答案,我认为这是一周的第一个星期一,我没有看到 Sunday.getMonth() == -1