繁体   English   中英

在 JavaScript 中获取给定月份和年份的周范围

[英]Get week range for given month and year in JavaScript

我需要在所选月份的相应周显示一系列日期。 假设选定的值为month=3 (April) 和year=2018 output 应显示所选特定月份中几周的范围日期列表。

month = 3;
year = 2018;

Output:

第 1 周:01/04/2018 - 01/04/2018

第 2 周:02/04/2018 - 08/04/2018

第 3 周:09/04/2018 - 15/04/2018

第 4 周:16/04/2018 - 22/04/2018

第 5 周:23/04/2018 - 29/04/2018

第 6 周:30/04/2018 - 30/04/2018

我试过这个 function 但它不能正常工作。 你能帮助我吗? 多谢。

public getWeeksInMonth(): {

  let year: number = 2018;
  let month: number = 3 //April;

  const weeks = [];
  const firstDay: Date = new Date(year, month, 1);
  const lastDay: Date = new Date(year, month + 1, 0);
  const daysInMonth: number = lastDay.getDate();
  let dayOfWeek: number = firstDay.getDay();
  let start: number;
  let end: number;

  for (let i = 1; i < daysInMonth + 1; i++) {

    if (dayOfWeek === 0 || i === 1) {
      start = i;
    }

    if (dayOfWeek === 6 || i === daysInMonth) {

      end = i;

      if ((start !== end) || (start === 30 && end === 30) || (start === 31 && end === 31)) {

        weeks.push({
          'start': start,
          'end': end
        });
      }
    }

    dayOfWeek = new Date(year, month, i).getDay();
  }

  return weeks;
}

第一个问题是星期日通过.getDay()而不是星期一得到0

解决了检查dayOfWeek === 1而不是dayOfWeek === 0dayOfWeek === 0而不是dayOfWeek === 6的问题。

第二个问题是你在推新week之前的检查。 您正在检查 if start !== endstart可能等于end

通过在推送新的一周并检查start后将start设置为 null 解决了这个问题。

(下面的例子是用 JS 写的,因为 TS 在 StackOverflow 上是无法运行的)

 function getWeeksInMonth() { let year = 2018; let month = 3; //April; const weeks = []; const firstDay = new Date(year, month, 1); const lastDay = new Date(year, month + 1, 0); const daysInMonth = lastDay.getDate(); let dayOfWeek = firstDay.getDay(); let start; let oldstart; let end; for (let i = 1; i < daysInMonth + 1; i++) { if (dayOfWeek === 1 || i === 1) { start = i; } if (dayOfWeek === 0 || i === daysInMonth) { end = i; if(start){ weeks.push({ 'start': start, 'end': end }); start = null; } } dayOfWeek = new Date(year, month, i + 1).getDay(); } return weeks; } console.log(getWeeksInMonth());

我稍微重构了您的解决方案,它似乎提供了预期的结果。

我的代码与您的代码完全相同(蛮力)方法:

  • 组成一个长度等于给定月份中的天数的数组(使用Array.from() ),并用该月每一天的日期填充它;
  • 循环遍历该数组(使用Array.prototype.reduce() )并放入对应于周的结果数组对象( {week,start,end} ),在您到达星期一时生成新对象,并在您到达星期日时关闭结束日期:

 const getWeeksInMonth = (month, year) => Array.from({length: (new Date(year, month+1, 0) - new Date(year, month, 0))/864E5}, (_,i) => new Date(year, month, i+1)).reduce((res,date,idx,self) => { const itsMonday = date.getDay() == 1, itsSunday = date.getDay() == 0, monthStart = idx == 0, monthEnd = idx == self.length-1, options = {dateStyle: 'short'}; if(itsMonday || monthStart) res.push({ week:(res[res.length-1]||{week:0}).week+1, start: date.toLocaleDateString('fr',options), end: (monthStart? date.toLocaleDateString('fr',options): '') }); if(itsSunday || monthEnd) res[res.length-1].end = date.toLocaleDateString('fr',options); return res; }, []); console.log(getWeeksInMonth(3,2018));
 .as-console-wrapper {min-height:100%}

我找到了解决方案。 这里完整的功能正常工作:

public getWeeksInMonth(): Observable<Week[]> {

    let year: number = 2018;
    let month: number = 3;

    const weeks: Week[] = [];

    const firstDay: Date = new Date(Date.UTC(year, month, 1));
    const lastDay: Date = new Date(Date.UTC(year, month + 1, 0));

    const daysInMonth: number = lastDay.getDate();
    let dayOfWeek: number = firstDay.getDay();

    let start: number;
    let end: number;

    for (let i = 1; i < daysInMonth + 1; i++) {

        if (dayOfWeek === 0 || i === 1) {
            start = i;
        }

        if (dayOfWeek === 0 && start === 1 && i !== daysInMonth) {
            end = 1;

            weeks.push({
                'start': start,
                'end': end
            });
        }
        if (dayOfWeek === 6 || i === daysInMonth) {
            end = i;
            if ((start !== end) || (start === 30 && end === 30) || (start === 31 && end === 31)) {

                weeks.push({
                    'start': start,
                    'end': end
                });
            }
        }
        dayOfWeek = new Date(year, month, i).getDay();
    }
    return of(weeks);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM