2010-03-20 4 views
10

В 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

В вашем вопросе отсутствует несколько параметров. Просьба быть более конкретным. Вы хотите количество полных недель в произвольный месяц, или вы хотите действительно определенное количество недель, например. 4.3, или вы хотите количество недель, которые имеют по крайней мере один день в месяце? Подписывайтесь на меня? –

ответ

22

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

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

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

Используется этот код для плагина календаря jQuery. Спасибо, что поделился! Вы можете проверить это здесь: https://github.com/joelalejandro/jquery-ja/wiki/ja.Calendar –

+1

Это замечательно. Любой шанс, который вы могли бы объяснить **, почему ** это работает? – GotDibbs

+2

Не работает, если неделя начинается в понедельник;) – Titmael

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 

Теперь нам просто нужно genericize его.

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

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

+0

Как вы могли бы назвать функцию в другом скрипте? (Я пока не очень хорошо разбираюсь в Javascript) –

+1

Включите js-файл на свою страницу и сделайте что-то вроде 'new Time (2008, 11) .weeksInMonth()'. –

+1

Исправьте меня, если я ошибаюсь, но не даст ли тот же результат в феврале с 28 днями, которые начинаются в воскресенье, и стандартным февралем, который начинается в любой другой день недели? Они равны ровно 4 неделям, но первый будет отображаться в 4 строках, второй - 5. –

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

0

Благодаря Ed Бедной для его решения, это то же самое, как дата прототип.

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

Это похоже на объектно-ориентированный способ определения функции. Отлично подходит для тех из нас, кто обладает передовыми навыками программирования. –

+0

Было бы неплохо указать startWeekDay, например, январь 2017 года начинается в воскресенье, так что 5 недель, если неделя начинается в воскресенье и 6, если неделя начинается в понедельник. – Natim

+0

Natim, я думаю, что ваше редактирование в моем OP такое же, как и мой повторный пост за январь 2018 года. (Я просто не знаю, как использовать оператор ||, поэтому я сделал трюк модуля). –

0

Это очень просто две строки кода. и я испытал 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); 
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 и его эквиваленте в Ob проективный-C, и она работает хорошо

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

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

Спасибо всем

2

иСПользоВания минутного расслоения плотной

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

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

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

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

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

Смежные вопросы