通过Javascript获得几个月的周

时间:2010-03-20 16:01:59

标签: javascript calendar

在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 

感谢您的帮助。

18 个答案:

答案 0 :(得分:26)

星期日开始

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

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);
}

答案 1 :(得分:5)

这里提出的解决方案都没有正常工作,因此我编写了自己的变体,适用于任何情况。

简单而有效的解决方案:

/**
 * 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;
};

you can try it here

答案 2 :(得分:4)

你必须计算它。

您可以执行类似

的操作
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中的月份为零(即1月== 0)。

答案 3 :(得分:3)

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(1月)-12(12月)

答案 4 :(得分:3)

最容易理解的方式是

<div id="demo"></div>

<script type="text/javascript">

 function numberOfDays(year, month)
 {
   var d = new Date(year, month, 0);
   return d.getDate();
 }


 function getMonthWeeks(year, month_number)
 {
   var $num_of_days       = numberOfDays(year, month_number)
    ,  $num_of_weeks      = 0
    ,  $start_day_of_week = 0; 

   for(i=1; i<=$num_of_days; i++)
   {
      var $day_of_week = new Date(year, month_number, i).getDay();
      if($day_of_week==$start_day_of_week)
      {
        $num_of_weeks++;
      }   
   }

    return $num_of_weeks;
 }

   var d = new Date()
      , m = d.getMonth()
      , y = d.getFullYear();

   document.getElementById('demo').innerHTML = getMonthWeeks(y, m);
</script>

答案 5 :(得分:2)

使用时刻js

function getWeeksInMonth(year, month){

        var monthStart     = moment().year(year).month(month).date(1);
        var monthEnd       = moment().year(year).month(month).endOf('month');
        var numDaysInMonth = moment().year(year).month(month).endOf('month').date();

        //calculate weeks in given month
        var weeks      = Math.ceil((numDaysInMonth + monthStart.day()) / 7);
        var weekRange  = [];
        var weekStart = moment().year(year).month(month).date(1);
        var i=0;

        while(i<weeks){
            var weekEnd   = moment(weekStart);


            if(weekEnd.endOf('week').date() <= numDaysInMonth && weekEnd.month() == month) {
                weekEnd = weekEnd.endOf('week').format('LL');
            }else{
                weekEnd = moment(monthEnd);
                weekEnd = weekEnd.format('LL')
            }

            weekRange.push({
                'weekStart': weekStart.format('LL'),
                'weekEnd': weekEnd
            });


            weekStart = weekStart.weekday(7);
            i++;
        }

        return weekRange;
    } console.log(getWeeksInMonth(2016, 7))

答案 6 :(得分:1)

您可以使用my time.js library。这是weeksInMonth函数:

// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67

weeksInMonth: function(){
  var millisecondsInThisMonth = this.clone().endOfMonth().epoch() - this.clone().firstDayInCalendarMonth().epoch();
  return Math.ceil(millisecondsInThisMonth / MILLISECONDS_IN_WEEK);
},

它可能有点模糊,因为功能的内容在endOfMonth和firstDayInCalendarMonth中,但你至少应该能够了解它是如何工作的。

答案 7 :(得分:1)

ES6变体,使用一致的基于零的月份索引。从2015年到2025年进行了多年的测试。

/**
 * Returns number of weeks
 *
 * @param {Number} year - full year (2018)
 * @param {Number} month - zero-based month index (0-11)
 * @param {Boolean} fromMonday - false if weeks start from Sunday, true - from Monday.
 * @returns {number}
 */
const weeksInMonth = (year, month, fromMonday = false) => {
    const first = new Date(year, month, 1);
    const last  = new Date(year, month + 1, 0);
    let dayOfWeek = first.getDay();
    if (fromMonday && dayOfWeek === 0) dayOfWeek = 7;
    let days = dayOfWeek + last.getDate();
    if (fromMonday) days -= 1;
    return Math.ceil(days / 7);
}

答案 8 :(得分:1)

这是非常简单的两行代码。我已经测试了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 ); 

答案 9 :(得分:0)

function getWeeksInMonth(month_number, year) {
  console.log("year - "+year+" month - "+month_number+1);

  var day = 0;
  var firstOfMonth = new Date(year, month_number, 1);
  var lastOfMonth = new Date(year, parseInt(month_number)+1, 0);

  if (firstOfMonth.getDay() == 0) {
    day = 2;
    firstOfMonth = firstOfMonth.setDate(day);
    firstOfMonth = new Date(firstOfMonth);
  } else if (firstOfMonth.getDay() != 1) {
    day = 9-(firstOfMonth.getDay());
    firstOfMonth = firstOfMonth.setDate(day);
    firstOfMonth = new Date(firstOfMonth);
  }

  var days = (lastOfMonth.getDate() - firstOfMonth.getDate())+1
  return Math.ceil( days / 7);              
}

它对我有用。请尝试

全部谢谢

答案 10 :(得分:0)

这段代码可以为您提供给定月份的确切周数:

Date.prototype.getMonthWeek = function(monthAdjustement)
{       
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
    var returnMessage = (Math.ceil(this.getDate()/7) + Math.floor(((7-firstDay)/7)));
    return returnMessage;
}

monthAdjustement变量会增加或减少您当前所在的月份

我在JS的日历项目中使用它,在Objective-C中使用它,它运行良好

答案 11 :(得分:0)

    function weekCount(year, month_number, day_start) {

        // month_number is in the range 1..12
        // day_start is in the range 0..6 (where Sun=0, Mon=1, ... Sat=6)

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

        var dayOffset = (firstOfMonth.getDay() - day_start + 7) % 7;
        var used = dayOffset + lastOfMonth.getDate();

        return Math.ceil( used / 7);
    }

答案 12 :(得分:0)

这对我有用,

function(d){
    var firstDay = new Date(this.getFullYear(), this.getMonth(), 1).getDay();
    return Math.ceil((d.getDate() + (firstDay - 1))/7);
}

“d”应该是日期。

答案 13 :(得分:0)

感谢Ed Poor的解决方案,这与Date原型相同。

Date.prototype.countWeeksOfMonth = function() {
  var year         = this.getFullYear();
  var month_number = this.getMonth();
  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);
}

所以你可以像

一样使用它
var weeksInCurrentMonth = new Date().countWeeksOfMonth();
var weeksInDecember2012 = new Date(2012,12,1).countWeeksOfMonth(); // 6

答案 14 :(得分:0)

我知道这来晚了,我已经看到代码上的代码试图获取特定月份的星期数,但是很多还不是很精确,但是大多数都非常有用,可重用,我不是专业的程序员,但我确实可以思考,并且由于某些人的一些代码,我得以得出结论。

function convertDate(date) {//i lost the guy who owns this code lol
var yyyy = date.getFullYear().toString();
var mm = (date.getMonth()+1).toString();
var dd  = date.getDate().toString();

var mmChars = mm.split('');
var ddChars = dd.split('');

return yyyy + '-' + (mmChars[1]?mm:"0"+mmChars[0]) + '-' + (ddChars[1]?dd:"0"+ddChars[0]);
}

//this line of code from https://stackoverflow.com/a/4028614/2540911
var days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'];

var myDate = new Date('2019-03-2');  
//var myDate = new Date(); //or todays date

var c = convertDate(myDate).split("-"); 
let yr = c[0], mth = c[1], dy = c[2];

weekCount(yr, mth, dy)

//Ahh yes, this line of code is from Natim Up there, incredible work, https://stackoverflow.com/a/2485172/2540911
function weekCount(year, month_number, startDayOfWeek) {
// month_number is in the range 1..12
  console.log(weekNumber);

// 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 first = firstOfMonth.getDate();

//initialize first week
let weekNumber = 1;
while(first-1 < numberOfDaysInMonth){    
// add a day
firstOfMonth = firstOfMonth.setDate(firstOfMonth.getDate() + 1);//this line of code from https://stackoverflow.com/a/9989458/2540911
if(days[firstOfMonth.getDay()] === "Sunday"){//get new week every new sunday according the local date format
  //get newWeek
  weekNumber++;          
}

  if(weekNumber === 3 && days[firstOfMonth.getDay()] === "Friday")
    alert(firstOfMonth);

  first++
 }
}

我需要此代码来在新月的每个第3个星期五为教堂生成时间表或事件时间表,因此您可以对其进行修改以适合您的情况,或者只是选择您的特定日期,而不是“星期五并指定星期几”一个月,瞧!你去了

答案 15 :(得分:0)

这里没有任何一种解决方案真正适合我。这是我的努力。

// Example
// weeksOfMonth(2019, 9) // October
// Result: 5
weeksOfMonth (year, monthIndex) {
  const d = new Date(year, monthIndex+ 1, 0)
  const adjustedDate = d.getDate() + d.getDay()
  return Math.ceil(adjustedDate / 7)
}

答案 16 :(得分:0)

基本但应该满足原始帖子:

/**
 * @param {date} 2020-01-30
 * @return {int} count
 */
this.numberOfCalendarWeekLines = date => {

    // get total
    let lastDayOfMonth = new Date( new Date( date ).getFullYear(), new Date( date ).getMonth() + 1, 0 );

    let manyDaysInMonth = lastDayOfMonth.getDate();

    // itterate through month - from 1st
    // count calender week lines by occurance
    // of a Saturday ( s m t w t f s )
    let countCalendarWeekLines = 0;

    for ( let i = 1; i <= manyDaysInMonth; i++ ) {

        if ( new Date( new Date( date ).setDate( i ) ).getDay() === 6 ) countCalendarWeekLines++;

    }

    // days after last occurance of Saturday 
    // leaked onto new line?
    if ( lastDayOfMonth.getDay() < 6 ) countCalendarWeekLines++;

    return countCalendarWeekLines;

};

答案 17 :(得分:0)

每个解决方案都有帮助,但没有任何解决方案对我有用,所以我用矩库做了我自己的:

const getWeeksInAMonth = (currentDate: string) => {
    const startOfMonth = moment(currentDate).startOf("month")
    const endOfMonth = moment(currentDate).endOf("month")
    return moment(endOfMonth).week() - moment(startOfMonth).week() + 1
}