Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 15.01.2016, 23:12
Новичок на форуме
Отправить личное сообщение для freenick Посмотреть профиль Найти все сообщения от freenick
 
Регистрация: 15.01.2016
Сообщений: 4

Количество отмеченный дней недели между двумя датами
Делаю курсач и попал в тупик. не знаю с какой стороны подойти и как сделать.
есть 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);
}
Ответить с цитированием
  #2 (permalink)  
Старый 16.01.2016, 14:23
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

Последний раз редактировалось Deff, 16.01.2016 в 14:26.
Ответить с цитированием
  #3 (permalink)  
Старый 17.01.2016, 18:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

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>
Ответить с цитированием
  #4 (permalink)  
Старый 18.01.2016, 16:42
Новичок на форуме
Отправить личное сообщение для freenick Посмотреть профиль Найти все сообщения от freenick
 
Регистрация: 15.01.2016
Сообщений: 4

рони,
я вот смотрю на твой код..и он кажется таким простым и гениальным.
если б не одно но: я половину не понимаю)
особенно вот эти 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);
}
Ответить с цитированием
  #5 (permalink)  
Старый 18.01.2016, 17:13
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

Сообщение от 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);
Ответить с цитированием
  #6 (permalink)  
Старый 18.01.2016, 19:44
Новичок на форуме
Отправить личное сообщение для freenick Посмотреть профиль Найти все сообщения от freenick
 
Регистрация: 15.01.2016
Сообщений: 4

рони,
Спасибо большое!
теперь могу с этим работать)
Ответить с цитированием
  #7 (permalink)  
Старый 18.01.2016, 23:20
без статуса
Отправить личное сообщение для Deff Посмотреть профиль Найти все сообщения от Deff
 
Регистрация: 25.05.2012
Сообщений: 8,219

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

Последний раз редактировалось Deff, 18.01.2016 в 23:23.
Ответить с цитированием
  #8 (permalink)  
Старый 19.01.2016, 00:25
Новичок на форуме
Отправить личное сообщение для freenick Посмотреть профиль Найти все сообщения от freenick
 
Регистрация: 15.01.2016
Сообщений: 4

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать текущий номер недели, или количество дней в текущем году. Hedkost Общие вопросы Javascript 12 17.11.2015 16:28
Количество дней между датами Intrerio Элементы интерфейса 7 20.10.2015 15:11
Промежуток времени между датами Octane Общие вопросы Javascript 16 02.12.2014 02:00
Количество дней между 2мя datapicker(ами) SeGun Элементы интерфейса 7 17.02.2013 19:19
Как получить количество дней до определенной даты beard Общие вопросы Javascript 3 24.06.2012 17:22