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関数は、月曜日でない場合は、今日から日曜日まで、および来週から月曜日から日曜日までの日付を表示するように機能します。しかし、この関数の問題点は、月が変更されたときにプッシュしないことです。したがって、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 日土曜日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();

たとえば 8 月の終わりになると、次の日曜日は 9 月 5 日で、週の最初の日は 8 月 30 日なので、diffは -25 で、テストでは次のようになります。

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

iは最初からdiffより小さいので、配列には何も追加されません。

1 つの修正方法は、次の日曜日までの日数を取得し、その日数分繰り返すことです。たとえば、

// 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()));

指定された日付が土曜日の場合、上記は日曜日のみの配列を返します。指定された日付が日曜日の場合、次の月曜日から日曜日までの配列を返します。

複数の週の日付を取得する場合は、2 番目のパラメーターを追加します。たとえば、デフォルトで 1 になる週を追加し、 whileループの前にcount(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 に答える