获取本月的第几周

IT技术 javascript jquery date
2021-03-05 19:31:03

如何使用 javascript/jquery 获取月份的周数?

例如:

第一周:2010 年 7 月 5 日。/周数 =第一个星期一

前一周:2010 年 7 月 12 日。/周数 =第二个星期一

当前日期:2010 年 7 月 19 日。/周数 =第三个星期一

下周:2010 年 7 月 26 日。/周数 =上周一

6个回答

这是一个古老的问题,但现有的答案完全是错误的。这是我的跨浏览器兼容解决方案:

    Date.prototype.getWeekOfMonth = function(exact) {
        var month = this.getMonth()
            , year = this.getFullYear()
            , firstWeekday = new Date(year, month, 1).getDay()
            , lastDateOfMonth = new Date(year, month + 1, 0).getDate()
            , offsetDate = this.getDate() + firstWeekday - 1
            , index = 1 // start index at 0 or 1, your choice
            , weeksInMonth = index + Math.ceil((lastDateOfMonth + firstWeekday - 7) / 7)
            , week = index + Math.floor(offsetDate / 7)
        ;
        if (exact || week < 2 + index) return week;
        return week === weeksInMonth ? index + 5 : week;
    };
    
    // Simple helper to parse YYYY-MM-DD as local
    function parseISOAsLocal(s){
      var b = s.split(/\D/);
      return new Date(b[0],b[1]-1,b[2]);
    }

    // Tests
    console.log('Date          Exact|expected   not exact|expected');
    [   ['2013-02-01', 1, 1],['2013-02-05', 2, 2],['2013-02-14', 3, 3],
        ['2013-02-23', 4, 4],['2013-02-24', 5, 6],['2013-02-28', 5, 6],
        ['2013-03-01', 1, 1],['2013-03-02', 1, 1],['2013-03-03', 2, 2],
        ['2013-03-15', 3, 3],['2013-03-17', 4, 4],['2013-03-23', 4, 4],
        ['2013-03-24', 5, 5],['2013-03-30', 5, 5],['2013-03-31', 6, 6]
    ].forEach(function(test){
      var d = parseISOAsLocal(test[0])
      console.log(test[0] + '        ' + 
      d.getWeekOfMonth(true) + '|' + test[1] + '                  ' +
      d.getWeekOfMonth() + '|' + test[2]); 
    });

如果你不想,你不需要直接把它放在原型上。在我的实现中,6 表示“最后一个”,而不是“第六个”。如果您希望它始终返回本月的实际周数,只需传递true.

编辑:修复此问题以处理 5 和 6 周的月份。我的“单元测试”,请随意分叉:http : //jsfiddle.net/OlsonDev/5mXF6/1/

当月份有 5 周时,脚本返回错误的星期日期
2021-04-19 19:31:03
@syclee如果您想跟踪它,在 momentjs 的 GitHub 存储库上创建了一个问题
2021-04-23 19:31:03
@Olson.dev 我可以问一下究竟是什么意思吗?它首先是什么?
2021-04-23 19:31:03
@PradipBhuvani 不,您不是 - 预计为 6。如果你想要 5,传递true给函数。请重新阅读我的回答;特别是代码片段下的位。
2021-05-01 19:31:03
这不会按预期工作。看着小提琴,它说,例如,2/24/13 是本月的第 5 个星期日,但实际上,它是本月的第 4 个星期日。
2021-05-06 19:31:03

在这个话题上也有挣扎 - 感谢 Olson.dev!如果有人感兴趣,我已经缩短了他的功能:

// returns week of the month starting with 0
Date.prototype.getWeekOfMonth = function() {
  var firstWeekday = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
  var offsetDate = this.getDate() + firstWeekday - 1;
  return Math.floor(offsetDate / 7);
}

更新:如果您需要本地化版本 - 您必须调整 firstWeekday 变量

// german version - week starts with monday
Date.prototype.getWeekOfMonth = function() {
  var firstWeekday = new Date(this.getFullYear(), this.getMonth(), 1).getDay() - 1;
  if (firstWeekday < 0) firstWeekday = 6;
  var offsetDate = this.getDate() + firstWeekday - 1;
  return Math.floor(offsetDate / 7);
}
Olso.dev 版本在 2020 年 4 月对我不起作用..这很好用,谢谢。
2021-04-18 19:31:03
我发现这只适用于offsetDate = this.getDate() + firstWeekday - 2,否则它会返回错误的周日值
2021-04-23 19:31:03
我认为您需要的是函数的本地化变体。我已经用另一个例子更新了代码 - 也许这有帮助。
2021-05-07 19:31:03

我认为这有效。它返回一个月中的第几周,从 0 开始:

var d = new Date();
var date = d.getDate();
var day = d.getDay();

var weekOfMonth = Math.ceil((date - 1 - day) / 7);
function getWeekOfMonth(date) {
  const startWeekDayIndex = 1; // 1 MonthDay 0 Sundays
  const firstDate = new Date(date.getFullYear(), date.getMonth(), 1);
  const firstDay = firstDate.getDay();

  let weekNumber = Math.ceil((date.getDate() + firstDay) / 7);
  if (startWeekDayIndex === 1) {
    if (date.getDay() === 0 && date.getDate() > 1) {
      weekNumber -= 1;
    }

    if (firstDate.getDate() === 1 && firstDay === 0 && date.getDate() > 1) {
      weekNumber += 1;
    }
  }
  return weekNumber;
}

我希望这有效 测试到 2025 年

这是几年过去了,但我最近需要使用此功能,并且在 2016/2020 年的某些日期(例如 1 月 31 日),这里的代码都不起作用。

无论如何,这都不是最有效的,但希望这可以帮助某人解决问题,因为这是我这些年以及每隔一年工作的唯一方法。

Date.prototype.getWeekOfMonth = function () {
    var dayOfMonth = this.getDay();
    var month = this.getMonth();
    var year = this.getFullYear();
    var checkDate = new Date(year, month, this.getDate());
    var checkDateTime = checkDate.getTime();
    var currentWeek = 0;

    for (var i = 1; i < 32; i++) {
        var loopDate = new Date(year, month, i);

        if (loopDate.getDay() == dayOfMonth) {
            currentWeek++;
        }

        if (loopDate.getTime() == checkDateTime) {
            return currentWeek;
        }
    }
};
部分工作,例如,2015-11-30 是在第六周,但您的代码在第五周显示(从星期一开始的一周)。
2021-04-28 19:31:03
我知道您发布此消息已经 7 个月了,但我用我的答案的功能测试了您的日期 01/31/2020 和 01/31/2020 并得到了预期的结果(2016 = 6|6, 2015 = 5|6 ...意思是正好第 6 周,也就是 2016 年的“上周”(6)正好第 5 周,也就是 2020 年的“上周”(6)。
2021-05-01 19:31:03