【问题标题】:Get weeks in year一年中获得几周
【发布时间】:2013-08-28 03:07:19
【问题描述】:

Moment js 有获取一个月天数的功能:http://momentjs.com/docs/#/displaying/days-in-month/

但是我找不到查找一年中 iso 周数(52 或 53)的函数。

【问题讨论】:

    标签: javascript momentjs


    【解决方案1】:

    这是一个不依赖于库的答案。它使用一个函数来计算所需年份的 12 月 31 日所在的那一周。如果周为 1(即 12 月 31 日在下一年的第一周),则将天数向下移动,直到获得不同的值,这将是所需年份的最后一周。

    function getWeekNumber(d) {
      // Copy date so don't modify original
      d = new Date(+d);
      d.setHours(0, 0, 0, 0);
      // Set to nearest Thursday: current date + 4 - current day number
      // Make Sunday's day number 7
      d.setDate(d.getDate() + 4 - (d.getDay() || 7));
      // Get first day of year
      var yearStart = new Date(d.getFullYear(), 0, 1);
      // Calculate full weeks to nearest Thursday
      var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7)
      // Return array of year and week number
      return [d.getFullYear(), weekNo];
    }
    
    function weeksInYear(year) {
      var month = 11,
        day = 31,
        week;
    
      // Find week that 31 Dec is in. If is first week, reduce date until
      // get previous week.
      do {
        d = new Date(year, month, day--);
        week = getWeekNumber(d)[1];
      } while (week == 1);
    
      return week;
    }
    
    [2015, 2016, 2029, new Date().getFullYear()].forEach(year =>
      console.log(`${year} has ${weeksInYear(year)} weeks`)
    );

    getWeekNumber 代码来自这里:Get week of year in JavaScript like in PHP。

    编辑

    或者,如果 12 月 31 日在下一年的第 1 周,则主题年有 52 周,否则有 53 周。

    function getWeekNumber(d) {
      d = new Date(+d);
      d.setHours(0, 0, 0, 0);
      d.setDate(d.getDate() + 4 - (d.getDay() || 7));
      var yearStart = new Date(d.getFullYear(), 0, 1);
      var weekNo = Math.ceil((((d - yearStart) / 86400000) + 1) / 7)
      return [d.getFullYear(), weekNo];
    }
    
    function weeksInYear(year) {
      var d = new Date(year, 11, 31);
      var week = getWeekNumber(d)[1];
      return week == 1 ? 52 : week;
    }
    
    [2015, 2016, 2029, new Date().getFullYear()].forEach(year =>
      console.log(`${year} has ${weeksInYear(year)} weeks`)
    );

    【讨论】:

    • 比 do-loop 简单地减去 7。
    • @ScottSauyet — 更简单的是,如果 12 月 31 日在第 1 周,则一年有 52 周,否则有 53 周。:-)
    【解决方案2】:

    在一年的最后一天使用 isoWeek 来获取周数,例如:

    function weeksInYear(year) {
       return Math.max(
                moment(new Date(year, 11, 31)).isoWeek()
              , moment(new Date(year, 11, 31-7)).isoWeek()
       );
    }
    

    【讨论】:

    • 当 12 月 31 日在次年的第 1 周时会发生什么?
    • 更新了答案。谢谢
    • 12 月 28 日始终是一年中的最后一周,因此您可以简单地获取该日期的 ISO 周。
    【解决方案3】:

    Feb. 4th 2014 在 moment.js 中添加了 weekInYear 和 isoWeeksInYear 函数

    所以今天你可以使用moment().isoWeeksInYear()或moment().weeksInYear()

    更多内容请看docs

    【讨论】:

      【解决方案4】:

      获取一年中该周的所有周和期间,它可能对谁感兴趣

      function getWeekPeriodsInYear(year) {
        weeks = [];
      
        // Get the first and last day of the year
        currentDay = moment([year, 1]).startOf('year');
        dayOfWeek = moment(currentDay).day();
        lastDay = moment([year, 1]).endOf('year');
        weeksInYear = moment(`${year}-01-01`).isoWeeksInYear();
        daysToAdd = 7 - dayOfWeek;
      
        for (let weekNumber = 1; weekNumber < weeksInYear + 1; weekNumber++) {
          let endOfWeek = moment(currentDay).add(daysToAdd, 'days');
          if (moment(endOfWeek).year() !== year) {
              endOfWeek = lastDay;
          }
          weeks.push({ weekNumber, start: currentDay.toDate(), end: endOfWeek.toDate() });
          currentDay = endOfWeek.add(1, 'day');
          daysToAdd = 6;
      }
      return weeks;
      }
      
      getWeekPeriodsInYear(new Date().getFullYear()).forEach(period =>
        document.write(`Week ${period.weekNumber} from ${moment(period.start).format('DD-MM-YYYY')} up to and including ${moment(period.end).format('DD-MM-YYYY')}<br/>`)
      );
      &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"&gt;&lt;/script&gt;

      【讨论】:

        猜你喜欢
        • 2011-12-10
        • 1970-01-01
        • 2011-10-06
        • 1970-01-01
        • 1970-01-01
        • 2015-11-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多