javascript 如何增加日期时,移动到其他月份

b5buobof  于 2023-04-10  发布在  Java
关注(0)|答案(2)|浏览(135)

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

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函数的工作原理就像如果它不是星期一,那么显示从今天到星期日和从下周从星期一到星期日的日期。但是这个函数的错误是当月份改变时它不会推送。所以对于4周console.log(dates)显示:

  • [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日星期六
2021 16:22:46 GMT+0200(中欧夏令时),周日8月22日
2021 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日星期六
2021 16:22:47 GMT+0200(中欧夏令时),周日8月29日
2021 16:22:47 GMT+0200(中欧夏令时)]

  • []

正如你所看到的,3周后,月份将改为九月,我认为这就是为什么它会变成一个空数组。我不知道是否有必要,但无论如何,这里是我使用的其他函数:

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在每次点击按钮时都会增加。

6tr1vspr

6tr1vspr1#

您的问题在这里:

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

当你到了8月底,下一个星期日是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()));

如果提供的日期是星期六,上面的函数返回一个星期天的数组。如果提供的日期是星期天,它返回一个下一个星期一到星期天的数组,等等。
如果你想获取多个星期的日期,添加第二个参数,比如 weeks,默认值为1,然后在 while 循环之前将(weeks - 1) * 7添加到 count。首先测试 weeks 以确保它是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()));
c3frrgcw

c3frrgcw2#

以下是移动到下个月时增加日期的示例:

let date = new Date(); // get current date
const month = date.getMonth(); // get current month
date.setMonth(month + 1); // increase month by 1

相关问题