通过 Javascript 获取每月的周数

IT技术 javascript calendar
2021-03-19 02:57:03

在 Javascript 中,如何获得一个月中的周数?我似乎无法在任何地方找到此代码。

我需要这个才能知道给定月份我需要多少行。

更具体地说,我想要一周中至少有一天的周数(一周被定义为从周日开始到周六结束)。

所以,对于这样的事情,我想知道它有 5 周:

S  M  T  W  R  F  S

         1  2  3  4

5  6  7  8  9  10 11

12 13 14 15 16 17 18

19 20 21 22 23 24 25

26 27 28 29 30 31 

感谢所有的帮助。

6个回答

星期从星期日开始

即使二月不是在周日开始,这也应该有效。

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

星期从星期一开始

function weekCount(year, month_number) {

    // month_number is in the range 1..12

    var firstOfMonth = new Date(year, month_number-1, 1);
    var lastOfMonth = new Date(year, month_number, 0);

    var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate();

    return Math.ceil( used / 7);
}

周从另一天开始

function weekCount(year, month_number, startDayOfWeek) {
  // month_number is in the range 1..12

  // Get the first day of week week day (0: Sunday, 1: Monday, ...)
  var firstDayOfWeek = startDayOfWeek || 0;

  var firstOfMonth = new Date(year, month_number-1, 1);
  var lastOfMonth = new Date(year, month_number, 0);
  var numberOfDaysInMonth = lastOfMonth.getDate();
  var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7;

  var used = firstWeekDay + numberOfDaysInMonth;

  return Math.ceil( used / 7);
}
将此代码用于 jQuery 日历插件。感谢分享!你可以在这里查看:github.com/joelalejandro/jquery-ja/wiki/ja.Calendar
2021-04-28 02:57:03
的确。2017 年 12 月返回 6 周,而当时只有 5 周。
2021-05-01 02:57:03
@Titmael 我已经更新了解决方案,使其在任何一天开始的几周内都能正常工作。
2021-05-03 02:57:03
这很棒。你有没有机会解释为什么这行得通?
2021-05-04 02:57:03
从星期一开始时仍然无法正常工作。只需检查 2018 年 1 月。它应该返回 5 周,但它返回 6。
2021-05-16 02:57:03

此处提出的所有解决方案均无法正常工作,因此我编写了自己的变体并且适用于任何情况。

简单而有效的解决方案:

/**
 * Returns count of weeks for year and month
 *
 * @param {Number} year - full year (2016)
 * @param {Number} month_number - month_number is in the range 1..12
 * @returns {number}
 */
var weeksCount = function(year, month_number) {
    var firstOfMonth = new Date(year, month_number - 1, 1);
    var day = firstOfMonth.getDay() || 6;
    day = day === 1 ? 0 : day;
    if (day) { day-- }
    var diff = 7 - day;
    var lastOfMonth = new Date(year, month_number, 0);
    var lastDate = lastOfMonth.getDate();
    if (lastOfMonth.getDay() === 1) {
        diff--;
    }
    var result = Math.ceil((lastDate - diff) / 7);
    return result + 1;
};

你可以在这里试试

对我来说它返回 5,你的意思是你尝试了 2018 年 9 月
2021-04-26 02:57:03
但是5如果你本地周从星期一开始这个功能不支持的First day of week功能
2021-05-01 02:57:03
“这里提出的所有解决方案都不能正常工作,所以我编写了自己的变体,它适用于任何情况。” 现在,对于每一个新答案,您都需要更新您的答案以捍卫这一陈述。
2021-05-06 02:57:03
这是为weeksCount(2018,9)返回错误的结果
2021-05-13 02:57:03
@MasterYoda @Prabha 正确结果是52018 年 9 月的 WeekCount(2018,9) url.upwork.com/_01_GXp87_p0P1s4yQShlUZ9PcxhqsECFVk
2021-05-19 02:57:03

这是非常简单的两行代码。我已经测试了 100%。

Date.prototype.getWeekOfMonth = function () {
    var firstDay = new Date(this.setDate(1)).getDay();
    var totalDays = new Date(this.getFullYear(), this.getMonth() + 1, 0).getDate();
    return Math.ceil((firstDay + totalDays) / 7);
}

如何使用

var totalWeeks = new Date().getWeekOfMonth();
console.log('Total Weeks in the Month are : + totalWeeks ); 
我正在寻找 dart 代码,在这里找到了,哈哈,谢谢你救了我的一天
2021-05-02 02:57:03

你得计算一下。

你可以做类似的事情

var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on
var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday

现在我们只需要泛化它。

var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ];
function GetNumWeeks(month, year)
{
    var firstDay = new Date(year, month, 1).getDay();
    var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks
    // TODO: account for leap years
    return baseWeeks + (firstDay >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day.
}

注意:调用时,请记住在 javascript 中月份索引为零(即一月 == 0)。

function weeksinMonth(m, y){
 y= y || new Date().getFullYear();
 var d= new Date(y, m, 0);
 return Math.floor((d.getDate()- 1)/7)+ 1;     
}
alert(weeksinMonth(3))

// 此方法的月份范围是 1(一月)-12(十二月)

现在在一个正常的场景中,一周在星期六结束。假设月份是 9 月,年份是 2018 。那么周数应该是 6 。日历见
2021-05-05 02:57:03
上面的答案只是计算“7天”组的数量。因此,无论开始日期是什么,所有 28 天的二月都将返回“4”周。
2021-05-13 02:57:03