Get weeks in year

岁酱吖の 提交于 2020-12-05 07:07:45

问题


Moment js has a function to get the number of days in a month : http://momentjs.com/docs/#/displaying/days-in-month/

However I could not find a function to find the number of iso weeks in a year (52 or 53).


回答1:


Here's an answer that isn't dependent on a library. It uses a function to calculate the week in the year that 31 December falls in for the required year. If the week is 1 (i.e. 31 December is in the first week of the following year), it moves the day number lower until it gets a different value, which will be the last week of the required year.

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`)
);

The getWeekNumber code is from here: Get week of year in JavaScript like in PHP.

Edit

Alternatively, if 31 December is in week 1 of the following year, then the subject year has 52 weeks and otherwise has 53 weeks.

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`)
);



回答2:


Use isoWeek on the last day of the year to get the number of weeks e.g. :

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



回答3:


Feb. 4th 2014 the weeksInYear & isoWeeksInYear functions were added to moment.js

So today you can just use moment().isoWeeksInYear()or moment().weeksInYear()

For more into see the docs




回答4:


Get all weeks and periods of that week for a year, for whom it may interest

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/>`)
);
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.29.1/moment.min.js"></script>


来源:https://stackoverflow.com/questions/18478741/get-weeks-in-year

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!