БлогNot. Пять уикендов в месяце

Пять уикендов в месяце

Имеется в виду, что в нём должно быть по пять пятниц, суббот и воскресений. Такое возможно, если в месяце 31 день и он начинается с пятницы.

Часто ли такое бывает? Да, довольно часто.

Ниже показан в работе маленький скрипт, решающий задачу о need ближайших месяцах с пятью уикендами, значение need передаётся аргументом функции, в исходнике оно равно 10, исходник приведён без HTML-обрамления.

Имейте в виду также вот эту заметку, календарь, и не верьте популярным нынче в сети "календарным" разводам :)

Выше (при включённом в браузере Javascript) выведется результат работы скрипта, а ниже - листинг на момент написания.

 <p id="nextFiveWeekendsItem"></p>
 <script>
  function getNextMonth (need) {
   var Months = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь',
   'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь' ];
   var leap = 0,
       offset = [3,0,3,2,3,2,3,3,2,3,2,3], // Относительные смещения между первыми днями месяцев
       longMonths = [1,3,5,7,8,10,12], //Месяцы по 31 дню
       dt = new Date(),
       startYear = dt.getFullYear(),
       startMonth = dt.getMonth(),
       dt1 = new Date(startYear,startMonth,1),
       year = startYear,
       day = dt1.getDay(),
       total = 0,
       result = [];
   for (; total < need; year++) {
    leap = totalPerYear = 0;
    if (year % 4 === 0) {
     if (year % 100 === 0) { if (year % 400 === 0) leap = 1; } 
     else leap = 1;
    }
    for (var i = startMonth; i < offset.length; i++) {
     for (var j = 0; day === 5 && j < longMonths.length; j++) {
       if (i + 1 === longMonths[j]) {
        total++;
        result.push (Months[i] + ' ' + year);
        if (result.length === need) return result;
       }
     }
     if (i == 1) day = (day + leap) % 7; 
     else day = (day + offset[i]) % 7;
    }
    startMonth = 0;
   }
   return result;
  }

  window.addEventListener('load', function (e) { //По загрузке выполнить это
   var r = getNextMonth(10);
   document.getElementById('nextFiveWeekendsItem').innerHTML = '';
   for (var i = 0 ; i < r.length; i++)
    document.getElementById('nextFiveWeekendsItem').innerHTML += r[i] + 
     (i < r.length-1 ? ', ' : '');
  }, false); 
 </script>
 <noscript><p>Включите Javascript для работы приложения!</p></noscript>

теги: дата javascript

01.06.2019, 14:17; рейтинг: 97