Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Количество отмеченный дней недели между двумя датами (https://javascript.ru/forum/jquery/60716-kolichestvo-otmechennyjj-dnejj-nedeli-mezhdu-dvumya-datami.html)

freenick 15.01.2016 23:12

Количество отмеченный дней недели между двумя датами
 
Делаю курсач и попал в тупик. не знаю с какой стороны подойти и как сделать.
есть 7 чекбоксов с днями неделями. юзер отмечает нужные.
есть накопительная sum.
а также две даты: сегодня и статическая когда-то.
нужно посчитать, сколько раз отмеченные дни недели встречаются между этими датами. т.е. отметил, например, вт, ср и сб, запустил функцию и она в sum накапливает, сколько раз эти дни встретились на промежутке между двумя датами.

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

<input type="checkbox" id="dOW" name="mon" value="1">ПН<br>
<input type="checkbox" id="dOW" name="tue" value="2">ВТ<br>
<input type="checkbox" id="dOW" name="wed" value="3">СР<br>
<input type="checkbox" id="dOW" name="thu" value="4">ЧТ<br>
<input type="checkbox" id="dOW" name="fri" value="5">ПТ<br>
<input type="checkbox" id="dOW" name="sat" value="6">СБ<br>
<input type="checkbox" id="dOW" name="sun" value="0">ВС<br>
<input type="button" name="save" id="save" value="GO" onclick=go()><br>


var today = new Date();
var futureDay = new Date(2016, 1, 21);
var oneDay=1000*3600*24;
var sum=0;
var test =today;
var days = (futureDay - today)/oneDay;

function go(){
	sum=0;
	for (i=0; i<days; i++) {
		test.setDate(test.getDate()+1);
		if (test.getDay()==0){
			sum+=1
		};
	};
	alert(sum);
}

Deff 16.01.2016 14:23

freenick,
var calendar = [];
var stDate = "2016,0,6".split(','); //стартовая; месяц от 0-11;
var next = +stDate[2];
var dat = new Date(stDate[0],stDate[1],next);
var end_dat = +new Date(2016,1,22); //конечная;
var st = + dat;
var countDay = 0;
while(end_dat- +(dat= new Date(stDate[0],stDate[1],next)) >= 0) {
  next++;

  calendar[countDay++] = [dat.getDate(), dat.getMonth()+1, dat.getDay()];

}

 //Третий элемент в подмассивах - день недели (0 - воскресенье)
  alert([countDay, JSON.stringify(calendar)]);

рони 17.01.2016 18:22

freenick,
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  </style>
</head>

<body>
<input type="checkbox" class="day" value="1">ПН<br>
<input type="checkbox" class="day" value="2">ВТ<br>
<input type="checkbox" class="day" value="3">СР<br>
<input type="checkbox" class="day" value="4">ЧТ<br>
<input type="checkbox" class="day" value="5">ПТ<br>
<input type="checkbox" class="day" value="6">СБ<br>
<input type="checkbox" class="day" value="0">ВС<br>
<input type="button" name="save" id="save" value="GO" ><br>

<script>
window.addEventListener('DOMContentLoaded', function() {
  var save = document.querySelector('#save');
  save.addEventListener('click', function() {
  var days = document.querySelectorAll('.day:checked'),
    sum = 0,
    arr = [].map.call( days, function(sel) {
         return +sel.value
     });
    var today = new Date();
    var futureDay = new Date(2016, 1, 16);
    for (; today<futureDay; )  {
    if (!!~arr.indexOf(today.getDay())) sum++;
    today.setDate(1 + today.getDate())
    }
    alert(sum)

  });
    });
</script>
</body>

</html>

freenick 18.01.2016 16:42

рони,
я вот смотрю на твой код..и он кажется таким простым и гениальным.
если б не одно но: я половину не понимаю)
особенно вот эти 2 момента:
arr = [].map.call( days, function(sel) {
         return +sel.value
     });

(!!~arr.indexOf(today.getDay()))

не мог бы объяснить, пожалуйста?

а своими силами я написал вот такой трэш:
var today = new Date();
var futureDay = new Date(2016, 1, 21);
var oneDay=1000*3600*24;
var sum=0;
var test =today;
var days = (futureDay - today)/oneDay;
function go(){
	sum=0;
	var mon, tue, wed, thu, fri, sat, sund;
	if (checkMon.checked){
		mon=1;
	};
	if (checkTue.checked){
		tue=2;
	};
	if (checkWed.checked){
		wed=3;
	};
	if (checkThu.checked){
		thu=4;
	};
	if (checkFri.checked){
		fri=5;
	};
	if (checkSat.checked){
		sat=6;
	};
	if (checkSund.checked){
		sund=0;
	};
	for (i=0; i<days; i++) {
	if (test.getDay()==sund || test.getDay()==mon || test.getDay()==tue || test.getDay()==wed || test.getDay()==thu || test.getDay()==fri || test.getDay()==sat){
			sum+=1
		};
		test.setDate(test.getDate()+1);
	};
	alert(sum);
}

рони 18.01.2016 17:13

Цитата:

Сообщение от freenick
arr = [].map.call( days, function(sel) { return +sel.value });

days собрали отмеченные checkbox и преобразовали в массив значений этих элементов
получилось типа [1,0] (понедельник, воскресенье)
https://learn.javascript.ru/traversi...массивы

каждый день проверяем
Цитата:

Сообщение от freenick
(!!~arr.indexOf(today.getDay()))

есть ли этот день в массиве отмеченных , то есть if (arr.indexOf(today.getDay()) !== -1)
alert(!!~-1);

freenick 18.01.2016 19:44

рони,
Спасибо большое!
теперь могу с этим работать)

Deff 18.01.2016 23:20

По идее, по календарю(calendar) удобнее считать отмеченные , ну и можно вывести календарик (в верхней строке день недели) с галками отмеченных(там уже и число и месяц и день недели. Просто повторный прогон по массиву calendar, (хотя можно и в цикле создания календаря добавлять отметки), лень писать код, :) , проще советовать...
Еще симпатичнее, без чекитов, прям в календаре тыкать даты(дни недели)

freenick 19.01.2016 00:25

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


Часовой пояс GMT +3, время: 03:22.