JavaScript:每年一周

时间:2012-12-10 07:54:36

标签: javascript datetime calendar week-number

在javascript中,我怎样才能知道某一年有多少周? 从年12月31日获得周数将失败,因为这可能导致第1周。

这个问题calculate number of weeks in a given year有点答案,但在JS中有没有任何巧妙的计算方法?

3 个答案:

答案 0 :(得分:6)

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
}

我将这两个帖子放在一起。

Calculating the number of weeks in a year with Ruby

javascript to find leap year

答案 1 :(得分:1)

这应该这样做=)

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
  • 这将首先获得您希望获得
  • 周的第一年的1月
  • 然后从给定日期开始减去第一个Jan(结果是那天以来的ms)
  • 除以86400000以获得天数
  • 添加自第一个月的星期日起的日期
  • 将所有内容除以7
  • 无论闰年如何都应该有效,因为它需要ms

如果你想坚持一周内第一年的Iso 8601 Week numbering状态

  • 本周第一个星期四(正式的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

你当然可以缩短代码并将它们全部压缩,但为了便于阅读,我宣称使用的变量就像天堂一样

您还可以查看此JSBin示例

答案 2 :(得分:0)

对于 ISO-8601 年:

方法一:

function FunctionP(y) {
    return (y + Math.floor(y/4) - Math.floor(y/100) + Math.floor(y/400)) % 7;
}

function WeekCount(y) {
    var additionalWeek = (FunctionP(y) == 4 || FunctionP(y-1) == 3) ? 1 : 0;
    return weekCount = 52 + additionalWeek;
}

方法 2:https://www.w3resource.com/javascript-exercises/javascript-date-exercise-24.php 中 GetISO8601Week 原型的逻辑

function GetMaxWeekCountOfISOYear(yyyy) {
  var dec31YYYY = (new Date(yyyy, 11, 31));
  var dec31Day = dec31YYYY.getDay();

  return dec31Day >= 1 && dec31Day <= 3 ?
    Number(GetSunday(dec31YYYY).GetISO8601Week()) :
    Number(dec31YYYY.GetISO8601Week());
}

Date.prototype.GetISO8601Week = function() {
  var target = new Date(this.valueOf());
  var dayNr = (this.getDay() + 6) % 7;
  target.setDate(target.getDate() - dayNr + 3);
  var firstThursday = target.valueOf();
  target.setMonth(0, 1);
  if (target.getDay() != 4) {
    target.setMonth(0, 1 + ((4 - target.getDay()) + 7) % 7);
  }
  return 1 + Math.ceil((firstThursday - target) / 604800000);
};

function GetSunday(requestDate) {
  requestDate = new Date(requestDate.setHours(0, 0, 0, 0));
  var day = requestDate.getDay(),
    diff = requestDate.getDate() - day;
  return new Date(requestDate.setDate(diff));
}