JavaScript:每年数周

JavaScript:每年数周,javascript,datetime,calendar,week-number,Javascript,Datetime,Calendar,Week Number,在javascript中,我如何知道一年有多少周? 从12月31日开始获取周数将失败,因为这可能导致第1周 这个问题在某种程度上回答了这个问题,但在JS中是否有任何简洁的计算方法?这应该可以做到=) 这将首先得到你想要的一年中的第一个1月 然后减去给定日期后的第一个1月(结果为自该日起的ms) 除以86400000得到一天的数量 添加自1月1日起一周中的星期日起的天数 全部除以7 不管闰年是多少,它都应该起作用,因为它需要ms 如果你想在一周内的第一年坚持哪个州 一周中有一年的第一个星期四

在javascript中,我如何知道一年有多少周? 从12月31日开始获取周数将失败,因为这可能导致第1周

这个问题在某种程度上回答了这个问题,但在JS中是否有任何简洁的计算方法?

这应该可以做到=)

  • 这将首先得到你想要的一年中的第一个1月
  • 然后减去给定日期后的第一个1月(结果为自该日起的ms)
  • 除以86400000得到一天的数量
  • 添加自1月1日起一周中的星期日起的天数
  • 全部除以7
  • 不管闰年是多少,它都应该起作用,因为它需要ms
如果你想在一周内的第一年坚持哪个州

  • 一周中有一年的第一个星期四(正式的ISO定义)
  • 1月4日的一周
  • 开始年份中的第一周(四天或四天以上),以及
  • 从12月29日至1月4日期间的星期一开始的一周
你可以稍微调整一下

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
当然,您可以缩短代码并将其压缩在一起,但为了可读性,我声明了使用的变量,如dayms


您还可以查看ISO 8601标准周的此示例

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
}
我从以下两篇文章中总结了这一点


答案取决于以下问题:你一年中的第一周是什么?这似乎在2013年9月1日失败,但在以后的日期会得到纠正。它错误地将9月1日星期日定为一年中的第36周。i、 e.console.log(getWeeks(新日期(“2013年9月1日”)//36@alimack谢谢你的评论:)我从手机回来后会看看括号的位置:
return(d.getDay()==4 | |(isLeap&d.getDay()==3))?53:52
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
}