0

我有一个日期集,我用当前周数和年份填充它:

dateSets(week, year) {
            let fistDayOfTheWeek = '';
            if(this.currentWeekNumber === this.getWeekNumber(new Date())) {
                fistDayOfTheWeek = new Date();
            } else {
                fistDayOfTheWeek = this.getDateOfWeek(week, year);
            }
            let sunday = new Date(fistDayOfTheWeek);
            sunday.setDate(sunday.getDate() - sunday.getDay() + 7);
            const dates = [];
            const diff = sunday.getDate() - fistDayOfTheWeek.getDate();
            for (let i = 0; i <= diff; i++) {
                const upDate = new Date();
                upDate.setDate(fistDayOfTheWeek.getDate() + i);
                dates.push(upDate);
            }
            console.log(dates)
            return dates;
        },

因此,显然我的 dateSet 函数的工作方式就像不是星期一,然后显示从今天到星期日以及从下周从星期一到星期日的日期。但是这个功能的问题是当月份更改时它不推送。因此,console.log(dates) 显示 4 周:

  • [2021 年 8 月 10 日星期二 16:22:43 GMT+0200(中欧夏令时间),2021 年 8 月 11 日星期三 16:22:43 GMT+0200(中欧夏令时间),2021 年 8 月 12 日星期四 16:22:43 GMT+ 0200(中欧夏令时间),2021 年 8 月 13 日星期五 16:22:43 GMT+0200(中欧夏令时间),2021 年 8 月 14 日星期六 16:22:43 GMT+0200(中欧夏令时间),2021 年 8 月 15 日星期日16:22:43 GMT+0200(中欧夏令时间)]

  • [2021 年 8 月 16 日星期一 16:22:46 GMT+0200(中欧夏令时间),
    2021 年 8 月 17 日星期二 16:22:46 GMT+0200(中欧夏令时间),2021 年 8 月 18 日星期三 16:22:46 GMT+ 0200(中欧夏令时间),2021 年 8 月 19 日星期四 16:22:46 GMT+0200(中欧夏令时间),2021 年 8 月 20 日星期五 16:22:46 GMT+0200(中欧夏令时间),
    2021 年8 月 21 日星期六16:22:46 GMT+0200(中欧夏令时间),
    2021 年 8 月 22 日星期日 16:22:46 GMT+0200(中欧夏令时间)]

  • [2021 年 8 月 23 日星期一 16:22:47 GMT+0200(中欧夏令时间),
    2021 年 8 月 24 日星期二 16:22:47 GMT+0200(中欧夏令时间),2021 年 8 月 25 日星期三 16:22:47 GMT+ 0200(中欧夏令时间),2021 年 8 月 26 日星期四 16:22:47 GMT+0200(中欧夏令时间),2021 年 8 月 27 日星期五 16:22:47 GMT+0200(中欧夏令时间),
    2021 年8 月 28 日星期六16:22:47 GMT+0200(中欧夏令时间),2021 年 8 月 29 日
    星期日 16:22:47 GMT+0200(中欧夏令时间)]

  • []

如您所见,3 周后,月份将更改为 9 月,我认为这就是为什么它会出现一个空数组的原因。我不知道是否有必要,但无论如何这里是我使用的其他功能:

getDateOfWeek(w, y) {
            var simple = new Date(y, 0, 1 + (w - 1) * 7);
            var dow = simple.getDay();
            var ISOweekStart = simple;
            if (dow <= 4)
                ISOweekStart.setDate(simple.getDate() - simple.getDay() + 1);
            else
                ISOweekStart.setDate(simple.getDate() + 8 - simple.getDay());
            return ISOweekStart;
        }

getWeekNumber(date) {
            const temp_date = new Date(date.valueOf());
            const dayn = (date.getDay() + 6) % 7;
            temp_date.setDate(temp_date.getDate() - dayn + 3);
            const firstThursday = temp_date.valueOf();
            temp_date.setMonth(0, 1);
            if (temp_date.getDay() !== 4)
            {
                temp_date.setMonth(0, 1 + ((4 - temp_date.getDay()) + 7) % 7);
            }
            return 1 + Math.ceil((firstThursday - temp_date) / 604800000);
        },

PS:每次单击按钮时,currentWeekNumber 都会增加。

4

1 回答 1

0

你的问题在这里:

const diff = sunday.getDate() - fistDayOfTheWeek.getDate();

当你到八月的月底时,下个星期天是 9 月 5 日,一周的第一天是 8 月 30 日,所以diff是 -25 并且在测试中:

for (let i = 0; i <= diff; i++) {

i从一开始就小于diff,因此没有任何内容添加到数组中。

一种解决方法是获取下周日之前的天数并迭代那么多天,例如

// Return an array of dates from tomorrow until the 
// following Sunday.
function getDatesToSunday(date = new Date()) {
  // Copy date so don't affect original
  let d = new Date(+date);
  // Get the number of days until the next Sunday
  let count = 7 - d.getDay();
  // Create array of Dates
  let dates = [];
  while (count--) { 
    dates.push (new Date(d.setDate(d.getDate() + 1)));
  }
  return dates;
}

console.log('Given Sun 29 Aug 2021:');
getDatesToSunday(new Date(2021, 7, 29))
  .forEach(d => console.log(d.toDateString()));
  
console.log('Rest of this week, or next if today is Sunday:');
getDatesToSunday()
  .forEach(d => console.log(d.toDateString()));

如果提供的日期是星期六,则上面返回一个仅包含星期日的数组。如果提供的日期是星期日,则返回下一个星期一到星期日的数组,依此类推。

如果您想获得多周的日期,请添加第二个参数,例如默认为 1 的周数,然后在while循环之前添加(weeks - 1) * 7计数。首先测试以确保它是 1 或更大(以负数开始递减while循环不是一个好主意)。

或者您可以继续添加天数直到星期日:

const getDatesToSunday = (date = new Date()) => {
  // Setup
  let year = date.getFullYear(),
      month = date.getMonth(),
      day = date.getDate(),
      dates = [];
  // Add dates from tomorrow until Sunday
  do {
    dates.push(new Date(year, month, ++day));
  } while (dates[dates.length - 1].getDay());
  return dates;
};

getDatesToSunday().forEach(d=>console.log(d.toDateString()));

于 2021-08-10T23:46:15.710 回答