簡體   English   中英

使用日期名稱和日期以數組形式獲取一個月中的周數

[英]Get weeks in a month as array with Day Name and Date

我有一個代碼可以在一個月內返回周的開始日期和結束日期,但我需要它返回整周的日期,日,月

月份從 0-11 開始

function getFullWeeksStartAndEndInMonth (month, year) {
    let weeks = [],
        firstDate = new Date(year, month, 1),
        lastDate = new Date(year, month + 1, 0),
        numDays = lastDate.getDate()

    let start = 1
    let end
    if (firstDate.getDay() === 1) {
        end = 7
    } else if (firstDate.getDay() === 0) {
        let preMonthEndDay = new Date(year, month, 0)
        start = preMonthEndDay.getDate() - 6 + 1
        end = 1
    } else {
        let preMonthEndDay = new Date(year, month, 0)
        start = preMonthEndDay.getDate() + 1 - firstDate.getDay() + 1
        end = 7 - firstDate.getDay() + 1
        weeks.push({
            start: start,
            end: end
        })
        start = end + 1
        end = end + 7
    }
    while (start <= numDays) {
        weeks.push({
            start: start,
            end: end
        });
        start = end + 1;
        end = end + 7;
        end = start === 1 && end === 8 ? 1 : end;
        if (end > numDays && start <= numDays) {
            end = end - numDays
            weeks.push({
                start: start,
                end: end
            })
            break
        }
    }
    return weeks
}

如何獲得完整的星期日期+日期+月份,而不僅僅是這樣的開始和結束日期

0: {date:30,month:"May",day:"Monday"},{date:31,month:"May",day:"Tuesday"},{date:1,month:"June",day:"Wednesday"},...

干得好

如果您需要任何解釋,請告訴我,這只是一個簡單的 .map,它會在一周內輸出七個包含所需信息的對象

目前,它是一個嵌套數組 - 外部數組中的每個項目都是一個一周的數組

如果你想展平它,取消注釋.flat(Infinity)

 function getFullWeeksStartAndEndInMonth (month, year) { let weeks = [], firstDate = new Date(year, month, 1), lastDate = new Date(year, month + 1, 0), numDays = lastDate.getDate() let start = 1 let end if (firstDate.getDay() === 1) { end = 7 } else if (firstDate.getDay() === 0) { let preMonthEndDay = new Date(year, month, 0) start = preMonthEndDay.getDate() - 6 + 1 end = 1 } else { let preMonthEndDay = new Date(year, month, 0) start = preMonthEndDay.getDate() + 1 - firstDate.getDay() + 1 end = 7 - firstDate.getDay() + 1 weeks.push({ start: start, end: end }) start = end + 1 end = end + 7 } while (start <= numDays) { weeks.push({ start: start, end: end }); start = end + 1; end = end + 7; end = start === 1 && end === 8 ? 1 : end; if (end > numDays && start <= numDays) { end = end - numDays weeks.push({ start: start, end: end }) break } } // *** the magic starts here return weeks.map(({start, end}, index) => { const sub = +(start > end && index === 0); return Array.from({length: 7}, (_, index) => { const date = new Date(year, month - sub, start + index); return { date: date.getDate(), month: date.toLocaleString('en', {month: 'long'}), day: date.toLocaleString('en', {weekday: 'long'}), }; }); })//.flat(Infinity); } console.log(getFullWeeksStartAndEndInMonth(6, 2022))

OP中的輸出示例:

0: {date: 30, month: "May", day: "Monday"},
   {date: 31, month: "May", day: "Tuesday"},
   {date: 1, month: "June", day: "Wednesday"},...

0:意味着它右邊的所有東西都是數組的第一個元素。 如果是這樣,那么它需要括號[] ,或者它是一個需要引號“”的字符串。 在 OP 中,結果看起來像一個數組,其中包含另一個包含對象的數組。 外部數組是沒有意義的。 提供的示例返回一個對象數組,這是最常用的數據結構之一:

[
  {date: 26, month: "May", day: "Thursday"},
  {date: 27, month: "May", day: "Friday"},
  {date: 28, month: "May", day: "Saturday"},
  {date: 29, month: "May", day: "Sunday"},...
]

細節在例子中注釋

 /** * @desc Given a start string date and an end string date, return * each day as an object consisting of {date, month, weekday} * in an array * @param {string<date>} from - A string in this format yyyy-mm-dd * @param {string<date>} to - See previous * @return {array<object>} An array of objects with the following: * {date: {number}, month: {string}, day: {string}} */ function dateRange(from, to) { // Convert the parameters into Date objects const start = new Date(from) const end = new Date(to); // Define array to return let range = []; /* While the start date is less than or equal to the end date... ...get a new date object setting it's date number ahead by 1... ...next get the new date... ...then the long version of the month... ...and then the long version of the weekday... ...create an object with those values matched to these keys: date, month, day... ...add the object to the range array */ while(start <= end) { const next = new Date(start.setDate(start.getDate()+1)); const date = next.getDate(); const month = next.toLocaleString('default', {month: 'long'}); const day = next.toLocaleString('default', {weekday: 'long'}); const dayObj = Object.assign({}, {date: date, month: month, day: day}); range.push(dayObj); } // After the while loop, return the range array return range; } console.log(dateRange('2022-05-26', '2022-06-12'));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM