JavaScript: Weeks per year

自作多情 提交于 2021-02-08 06:44:27

问题


In javascript, how can I find out how many weeks a given year has? Getting the weeknumber from year-dec-31 will fail since that can result in week 1.

This question calculate number of weeks in a given year sort of answers it, but is there any neat way of calculating this in JS?


回答1:


For the ISO 8601 Standard Weeks

function getISOWeeks(y) {
    var d,
        isLeap;

    d = new Date(y, 0, 1);
    isLeap = new Date(y, 1, 29).getMonth() === 1;

    //check for a Jan 1 that's a Thursday or a leap year that has a 
    //Wednesday jan 1. Otherwise it's 52
    return d.getDay() === 4 || isLeap && d.getDay() === 3 ? 53 : 52
}

I put this together from the two following posts.

Calculating the number of weeks in a year with Ruby

javascript to find leap year




回答2:


This should do it =)

function getWeeks(d) {
 var first = new Date(d.getFullYear(),0,1);
 var dayms = 1000 * 60 * 60 * 24;
 var numday = ((d - first)/dayms)
 var weeks = Math.ceil((numday + first.getDay()+1) / 7) ; 
 return weeks


}

console.log(getWeeks(new Date("31 Dec 2012"))) // 53
  • This will first get the First Jan of the year you want to get the Weeks of
  • Then substracts the first Jan from date given (results in the ms since that day)
  • Divides it by 86400000 to get the number of day
  • Adds the days since the sunday of the week from the first Jan
  • Divides it all by 7
  • Which should work regardless of Leap Years because it takes ms

If you want to stick to the Iso 8601 Week numbering which state for the first year in a week

  • the week with the year's first Thursday in it (the formal ISO definition),
  • the week with 4 January in it,
  • the first week with the majority (four or more) of its days in the starting year, and
  • the week starting with the Monday in the period 29 December – 4 January.

You can adjust it slightly to this

function getIsoWeeks(d) {
 var first = new Date(d.getFullYear(),0,4);
 var dayms = 1000 * 60 * 60 * 24;
 var numday = ((d - first)/dayms)
 var weeks = Math.ceil((numday + first.getDay()+1) / 7) ; 
 return weeks   
}

console.log(getWeeks(new Date("31 Dec 2016"))) // 53
console.log(getIsoWeeks(new Date("31 Dec 2016")) //52

You could of course short the code and squeeze it all together, but for readability i declared the used vars like dayms

You can also take a look at this JSBin example



来源:https://stackoverflow.com/questions/13796950/javascript-weeks-per-year

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