Получите недели за месяц через Javascript

В 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 

Спасибо за помощь.

Ответ 1

Неделя начинается в воскресенье

Это должно работать, даже если февраль не начнется в воскресенье.

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

Ответ 2

Ни одно из предложенных здесь решений не работает правильно, поэтому я написал свой вариант, и он работает для любых случаев.

Простое и рабочее решение:

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

Вы можете попробовать это здесь

Ответ 3

Вам придется рассчитать это.

Вы можете сделать что-то вроде

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).

Ответ 4

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 (декабрь)

Ответ 5

Самый простой способ понять -

<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>

Ответ 6

Это очень простой двухстрочный код. и я испытал 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 ); 

Ответ 7

с использованием момента 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))

Ответ 8

Вы можете использовать мою библиотеку time.js. Здесь функция weekInMonth:

// 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, но вы должны хотя бы иметь возможность понять, как это работает.

Ответ 9

Вариант 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);
}

Ответ 10

Благодаря 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

Ответ 11

Этот фрагмент кода дает вам точное количество недель в данном месяце:

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, и он хорошо работает

Ответ 12

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

Это сработало для меня. Попробуйте

Спасибо всем

Ответ 13

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

Ответ 14

Это работает для меня,

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

"d" должна быть дата.

Ответ 15

Я знаю, что это поздно, я видел коды на кодах, пытающиеся определить количество недель, на которые падает конкретный месяц, но многие из них не совсем точны, но большинство из них были действительно информативными и пригодными для повторного использования, я не опытный программист, но Я действительно могу думать, и благодаря некоторым кодам некоторых людей я смог прийти к выводу.

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-ю пятницу нового месяца, чтобы вы могли изменить его в соответствии с вашими предпочтениями или просто выбрать конкретную дату, а не "пятницу" и указать неделю месяца и вуаля. !! Ну вот

Ответ 16

Ни одно из решений здесь действительно не сработало для меня. Вот моя трещина в этом.

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