Получить недели в месяц через Javascript - PullRequest
14 голосов
/ 20 марта 2010

Как в 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 

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

Ответы [ 15 ]

26 голосов
/ 21 марта 2010

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

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

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);
}
5 голосов
/ 30 сентября 2016

Ни одно из предложенных здесь решений не работает правильно, поэтому я написал свой вариант, и он работает для любых случаев. Простое и рабочее решение: </p> <pre><code>/** * 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; }; </code> вы можете попробовать здесь

4 голосов
/ 20 марта 2010

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

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

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

3 голосов
/ 27 ноября 2014

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

<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>
3 голосов
/ 20 марта 2010
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 (декабрь)

2 голосов
/ 18 июля 2016

с использованием момента 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))
2 голосов
/ 13 июня 2013

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

вариант 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);
}
1 голос
/ 20 марта 2010

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

0 голосов
/ 10 февраля 2019

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...