2014-01-29 8 views
-1

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

function sundaysInMonth(start) { 
     var dat = new Date('1 ' + start); 
     var y = dat.getFullYear(); 
     var m = dat.getMonth() + 1; 
     var days = new Date(y,m,0).getDate(); 
     var sundays = [ 8 - (new Date(m + '/01/' + y).getDay()) ]; 
     for (var i = sundays[0] + 7; i < days; i += 7) { 
      sundays.push(i); 
     } 
     return sundays.length; 
    } 

Когда я звоню выше функции, такие как console.log(sundaysInMonth('September 2013')); то он возвращает 4 тогда September 2013 имеет 5 воскресений.

Я получаю выше кода из этого post

+1

, когда вы просматриваете свой код в отладчике инструментов разработчика, какая строка имеет первую ошибку? –

+0

Ошибка отсутствует. Он просто возвращает неверный результат. – 2619

+0

Начните с некоторой очевидной отладки. Например, переменная 'days' инициализирована с правильным номером? И почему вы начинаете восьмой месяц? Дни считаются 0..6. – usr2564301

ответ

4

Петли для этого расчета не нужны.

function sundaysInMonth(start) { 
    var d = new Date('1 ' + start); // May not parse in all browsers 
    var ndays = new Date(d.getFullYear(), d.getMonth()+1, 0).getDate(); 
    return Math.floor((ndays + (d.getDay() + 6) % 7)/7); 
} 

Тест для всех месяцев 2013 года: http://jsfiddle.net/rGN28/2/

1

Проверка этого. Я просто Устранена проблема в вашем коде

function sundaysInMonth(start) { 
     var dat = new Date('1 ' + start); 
     var y = dat.getFullYear(); 
     var m = dat.getMonth() + 1; 
     var days = new Date(y,m,0).getDate(); 
     var sundays = [ (8 - (new Date(m + '/01/' + y).getDay())) % 7 ]; 

     for (var i = sundays[0] + 7; i < days; i += 7) { 
      sundays.push(i); 

     } 
     return sundays.length; 

    } 

В переменном массиве sundays мы должны intially сохранить первое значение дня, которое является воскресеньем. Была небольшая ошибка в течение нескольких месяцев с 1-го дня в воскресенье. Например, как в вашем вопросе September 2013 За эти месяцы ваш код будет хранить 8 вместо 1sundays массив как первое воскресенье. Я установил его

3

Aw, Мэтт бил меня на одну минуту! Я придумал в основном то же самое решение, только с большим количеством комментариев. ;)

function sundaysInMonth(sMonthAndYear) { 

// Get the year and month as integers 
    var dDate = new Date('1 ' + sMonthAndYear); 
    var y = dDate.getFullYear(); 
    var m = dDate.getMonth() + 1; 

// Get the number of days in the month 
    var iDayCount = new Date(y,m,0).getDate(); 

// Find the first Sunday 
    var iFirstSunday = (8 - dDate.getDay()); 
    if (iFirstSunday > 7) {iFirstSunday = 1}; 

// Calculate the total number of Sundays in the month 
    var iSundayCount = Math.ceil ((iDayCount + 1 - iFirstSunday)/7); 

// Return the count 
    return iSundayCount; 

} 
+0

+1 В любом случае :) подтвердил, что это работает правильно на все месяцы в 2013 году. – Matt

+0

Спасибо Matt! Я пробовал +1 твою, но я слишком новичок и не имею репутации ... – BrettFromLA

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